diff --git a/Export/exportDXF.py b/Export/exportDXF.py index 8102e43..0e46425 100644 --- a/Export/exportDXF.py +++ b/Export/exportDXF.py @@ -4,7 +4,7 @@ from Utils.PVPlantUtils import findObjects if FreeCAD.GuiUp: import FreeCADGui - from PySide import QtCore, QtGui + from PySide import QtCore, QtGui, QtWidgets from PySide.QtCore import QT_TRANSLATE_NOOP import os @@ -28,10 +28,164 @@ from PVPlantResources import DirIcons as DirIcons field = {"name": "", "width": 0, "heigth": 0} +class LineTypeDelegate(QtWidgets.QStyledItemDelegate): + def __init__(self, parent=None): + super().__init__(parent) + self.line_types = [ + {"name": "Continuous", "pen": QtCore.Qt.SolidLine}, + {"name": "Dashed", "pen": QtCore.Qt.DashLine}, + {"name": "Dotted", "pen": QtCore.Qt.DotLine}, + {"name": "Dash-Dot", "pen": QtCore.Qt.DashDotLine}, + {"name": "Dash-Dot-Dot", "pen": QtCore.Qt.DashDotDotLine} + ] + + def paint(self, painter, option, index): + # Dibujar el fondo + painter.save() + painter.setRenderHint(QtGui.QPainter.Antialiasing) + + # Configuraciones comunes + line_color = QtGui.QColor(0, 0, 0) # Color de la línea + line_width = 2 # Grosor de línea + + # Dibujar el ítem base + super().paint(painter, option, index) + + # Obtener el tipo de línea + line_type = self.line_types[index.row()] + + # Configurar el área de dibujo + text_rect = option.rect.adjusted(5, 0, -100, 0) + line_rect = option.rect.adjusted(option.rect.width() - 90, 2, -5, -2) + + # Dibujar el texto + painter.drawText(text_rect, QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, line_type["name"]) + + # Dibujar la línea de muestra + pen = QtGui.QPen(line_color, line_width, line_type["pen"]) + painter.setPen(pen) + + start_y = line_rect.center().y() + painter.drawLine(line_rect.left(), start_y, line_rect.right(), start_y) + + painter.restore() + + def sizeHint(self, option, index): + size = super().sizeHint(option, index) + size.setHeight(25) # Altura aumentada para mejor visualización + return size + + +class LineTypePreviewDelegate(QtWidgets.QStyledItemDelegate): + def __init__(self, parent=None): + super().__init__(parent) + '''self.line_types = [ + ("Continuous", QtCore.Qt.SolidLine), + ("Dashed", QtCore.Qt.DashLine), + ("Dotted", QtCore.Qt.DotLine), + ("Dash-Dot", QtCore.Qt.DashDotLine), + ("Dash-Dot-Dot", QtCore.Qt.DashDotDotLine) + ]''' + + self.line_types = [ + {"name": "Continuous", "style": QtCore.Qt.SolidLine}, + {"name": "Dashed", "style": QtCore.Qt.DashLine}, + {"name": "Dotted", "style": QtCore.Qt.DotLine}, + {"name": "Custom 1 (--0--0--)", + "style": QtCore.Qt.CustomDashLine, + "pattern": [8, 4, 2, 4]}, # Patrón personalizado + {"name": "Custom 2 (- - -)", + "style": QtCore.Qt.CustomDashLine, + "pattern": [6, 3]} # Otro patrón + ] + + def paint(self, painter, option, index): + painter.save() + painter.setRenderHint(QtGui.QPainter.Antialiasing) + + if index.row() >= len(self.line_types): + painter.restore() + return + + line_data = self.line_types[index.row()] + line_name = line_data["name"] + line_style = line_data.get("style", QtCore.Qt.SolidLine) + dash_pattern = line_data.get("pattern", []) + + # Fondo para selección + if option.state & QtGui.QStyle.State_Selected: + painter.fillRect(option.rect, option.palette.highlight()) + + # Áreas de dibujo + text_rect = option.rect.adjusted(5, 0, -100, 0) + preview_rect = option.rect.adjusted(option.rect.width() - 90, 2, -5, -2) + + # Texto + painter.setPen(option.palette.color(QtGui.QPalette.Text)) + painter.drawText(text_rect, QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, line_name) + + # Línea personalizada + pen = QtGui.QPen(QtGui.QColor(0, 0, 0), 2) + pen.setStyle(line_style) + + if line_style == QtCore.Qt.CustomDashLine and dash_pattern: + pen.setDashPattern(dash_pattern) + + painter.setPen(pen) + painter.drawLine(preview_rect.left(), preview_rect.center().y(), + preview_rect.right(), preview_rect.center().y()) + + painter.restore() + + def sizeHint(self, option, index): + return QtCore.QSize(200, 25) + + +class LineTypeComboBox(QtWidgets.QComboBox): + def __init__(self, parent=None): + super().__init__(parent) + self._delegate = LineTypePreviewDelegate(self) + self.setItemDelegate(self._delegate) + self.addItems(["Continuous", "Dashed", "Dotted", "Dash-Dot", "Dash-Dot-Dot"]) + + def paintEvent(self, event): + painter = QtGui.QPainter(self) + painter.setRenderHint(QtGui.QPainter.Antialiasing) + + # Dibujar el fondo del combobox + option = QtWidgets.QStyleOptionComboBox() + self.initStyleOption(option) + self.style().drawComplexControl(QtGui.QStyle.CC_ComboBox, option, painter, self) + + # Obtener el texto y estilo actual + current_text = self.currentText() + line_style = next( + (style for name, style in self._delegate.line_types if name == current_text), + QtCore.Qt.SolidLine + ) + + # Área de dibujo + text_rect = self.rect().adjusted(5, 0, -30, 0) + preview_rect = self.rect().adjusted(self.width() - 70, 2, -5, -2) + + # Dibujar texto + painter.setPen(self.palette().color(QtGui.QPalette.Text)) + painter.drawText(text_rect, QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, current_text) + + # Dibujar línea de previsualización + pen = QtGui.QPen(QtGui.QColor(0, 0, 0), 2) + pen.setStyle(line_style) + painter.setPen(pen) + + center_y = preview_rect.center().y() + painter.drawLine(preview_rect.left(), center_y, preview_rect.right(), center_y) + + class exportDXF: def __init__(self, filename): ''' ''' + self.doc = None self.msp = None self.filename = filename @@ -269,11 +423,13 @@ class _PVPlantExportDXF(QtGui.QWidget): QtGui.QWidget.__init__(self) import os + from datetime import datetime # self.form: self.form = FreeCADGui.PySideUic.loadUi( os.path.join(os.path.dirname(os.path.realpath(__file__)), "exportDXF.ui")) # setWindowIcon(QtGui.QIcon(os.path.join(PVPlantResources.DirIcons, "convert.svg"))) # self.form.buttonTo.clicked.connect(self.addTo) + self.form.tableLayers.setItemDelegateForColumn(3, LineTypeDelegate()) self.layout = QtGui.QHBoxLayout(self) self.layout.setContentsMargins(4, 4, 4, 4) @@ -281,10 +437,75 @@ class _PVPlantExportDXF(QtGui.QWidget): self.form.buttonAcept.clicked.connect(self.onAceptClick) + self.add_row("Layer 1", QtGui.QColor(255, 0, 0), "Continua", "1") + self.add_row("Layer 2", QtGui.QColor(255, 0, 0), "Continua", "1") + path = os.path.join(os.path.dirname(FreeCAD.ActiveDocument.FileName), "outputs", "autocad") if not os.path.exists(path): os.makedirs(path) - self.filename = os.path.join(path, FreeCAD.ActiveDocument.Name) + ".dxf" + name = datetime.now().strftime("%Y%m%d%H%M%S") + "-" + FreeCAD.ActiveDocument.Name + self.filename = os.path.join(path, name) + ".dxf" + + def add_row(self, name, color, line_type, thickness): + row = self.form.tableLayers.rowCount() + self.form.tableLayers.insertRow(row) + self.form.tableLayers.setRowHeight(row, 20) + + # Columna 0: Checkbox + checkbox = QtWidgets.QCheckBox() + cell_widget = QtWidgets.QWidget() + layout = QtWidgets.QHBoxLayout(cell_widget) + layout.addWidget(checkbox) + layout.setAlignment(QtCore.Qt.AlignCenter) + layout.setContentsMargins(0, 0, 0, 0) + self.form.tableLayers.setCellWidget(row, 0, cell_widget) + + # Columna 1: Nombre (editable) + item = QtWidgets.QTableWidgetItem(name) + item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) + self.form.tableLayers.setItem(row, 1, item) + + # Columna 2: Selector de color + color_btn = QtWidgets.QPushButton() + color_btn.setFixedSize(20, 20) # Tamaño del cuadrado + color_btn.setStyleSheet(f""" + QPushButton {{ + background-color: {color.name()}; + border: 1px solid #808080; + border-radius: 3px; + }} + QPushButton:hover {{ + border: 2px solid #606060; + }} + """) + color_btn.color = color # Almacenar el color como atributo + color_btn.clicked.connect(lambda: self.change_color(color_btn)) + + # Widget contenedor para centrar el botón + cell_widget = QtWidgets.QWidget() + layout = QtWidgets.QHBoxLayout(cell_widget) + layout.addWidget(color_btn) + layout.setAlignment(QtCore.Qt.AlignCenter) + layout.setContentsMargins(0, 0, 0, 0) + self.form.tableLayers.setCellWidget(row, 2, cell_widget) + + # Columna 3: Tipo de línea (combobox) + line_combo = LineTypeComboBox() + line_combo.addItems(["Continua", "Discontinua", "Punteada", "Mixta"]) + line_combo.setCurrentText(line_type) + self.form.tableLayers.setCellWidget(row, 3, line_combo) + + # Columna 4: Grosor de línea (combobox) + thickness_combo = QtWidgets.QComboBox() + thickness_combo.addItems(["1", "2", "3", "4"]) + thickness_combo.setCurrentText(thickness) + self.form.tableLayers.setCellWidget(row, 4, thickness_combo) + + def change_color(self, button): + color = QtWidgets.QColorDialog.getColor(button.color, self, "Seleccionar color") + if color.isValid(): + button.color = color + button.setStyleSheet(f"background-color: {color.name()}") def createLayers(self): ''' ''' @@ -297,16 +518,19 @@ class _PVPlantExportDXF(QtGui.QWidget): def writeArea(self): - for area in FreeCAD.ActiveDocument.Boundary.Group: + pol = self.exporter.createPolyline(FreeCAD.ActiveDocument.Site.Boundary) + pol.dxf.layer = "boundary" + + for area in FreeCAD.ActiveDocument.Boundaries.Group: pol = self.exporter.createPolyline(area) pol.dxf.layer = "Areas_Boundary" - for area in FreeCAD.ActiveDocument.Exclusion.Group: + for area in FreeCAD.ActiveDocument.Exclusions.Group: pol = self.exporter.createPolyline(area) pol.dxf.layer = "Areas_Exclusion" for area in FreeCAD.ActiveDocument.Offsets.Group: - self.exporter.createPolyline(area) + pol = self.exporter.createPolyline(area) pol.dxf.layer = "Areas_Offsets" def writeFrameSetups(self): @@ -441,7 +665,7 @@ class _PVPlantExportDXF(QtGui.QWidget): self.close() -class _CommandExportDXF: +class CommandExportDXF: def GetResources(self): return {'Pixmap': str(os.path.join(DirIcons, "dxf.svg")), 'Accel': "E, A", @@ -462,5 +686,5 @@ class _CommandExportDXF: return False -if FreeCAD.GuiUp: - FreeCADGui.addCommand('exportDXF', _CommandExportDXF()) +'''if FreeCAD.GuiUp: + FreeCADGui.addCommand('exportDXF', _CommandExportDXF())''' diff --git a/Export/exportDXF.ui b/Export/exportDXF.ui index bed4fa2..d8638d3 100644 --- a/Export/exportDXF.ui +++ b/Export/exportDXF.ui @@ -33,13 +33,171 @@ - Tab 1 + Layers + + + + + false + + + false + + + false + + + false + + + + + + + Sel + + + + + Name + + + + + Color + + + + + LineType + + + + + Lineweight + + + + + - Tab 2 + Objetos a exportar + + + + + false + + + + + + + New Row + + + + + New Row + + + + + Sel + + + + + Name + + + + + Color + + + + + LineType + + + + + Lineweight + + + + + + + + + + + + + + Planos en papel a crear + + + + + + false + + + false + + + + + + + New Row + + + + + New Row + + + + + Sel + + + + + Name + + + + + Color + + + + + LineType + + + + + Lineweight + + + + + + + + + +