Draft/BIM: Change Continue behavior and caching among commands (#20748)

* Draft: Cache ContinueMode setting for every tool separately

Currently ContinueMode is done to be held globally, so this patch
changes this to cache it inside `user.cfg` for every cmd separately.

* Draft: Add Chained Mode option for Dimension

Added new option under Dimension, although this is simply porting the
existing logic of "Continue" under "Chained Mode", whereas allowing
existing "Continue" mode to retrigger the command instead of placing
Dimensions in a chain.
This commit is contained in:
tetektoza
2025-04-18 17:56:21 +02:00
committed by GitHub
parent 56421bf73d
commit 2a983b587d
8 changed files with 106 additions and 95 deletions

View File

@@ -295,7 +295,6 @@ class _CommandStructure:
self.Length = params.get_param_arch("StructureLength")
self.Height = params.get_param_arch("StructureHeight")
self.Profile = None
self.continueCmd = False
self.bpoint = None
self.bmode = False
self.precastvalues = None
@@ -338,6 +337,7 @@ class _CommandStructure:
title=translate("Arch","Base point of column")+":"
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
FreeCADGui.Snapper.getPoint(callback=self.getPoint,movecallback=self.update,extradlg=[self.taskbox(),self.precast.form,self.dents.form],title=title)
FreeCADGui.draftToolBar.continueCmd.show()
def getPoint(self,point=None,obj=None):
@@ -423,7 +423,7 @@ class _CommandStructure:
FreeCAD.ActiveDocument.recompute()
# gui_utils.end_all_events() # Causes a crash on Linux.
self.tracker.finalize()
if self.continueCmd:
if FreeCADGui.draftToolBar.continueCmd.isChecked():
self.Activated()
def _createItemlist(self, baselist):
@@ -505,21 +505,10 @@ class _CommandStructure:
grid.addWidget(self.vHeight,6,1,1,1)
# horizontal button
value5 = QtGui.QPushButton(translate("Arch","Switch Length/Height"))
grid.addWidget(value5,7,0,1,1)
value6 = QtGui.QPushButton(translate("Arch","Switch Length/Width"))
grid.addWidget(value6,7,1,1,1)
# continue button
label4 = QtGui.QLabel(translate("Arch","Con&tinue"))
value4 = QtGui.QCheckBox()
value4.setObjectName("ContinueCmd")
value4.setLayoutDirection(QtCore.Qt.RightToLeft)
label4.setBuddy(value4)
self.continueCmd = params.get_param("ContinueMode")
value4.setChecked(self.continueCmd)
grid.addWidget(label4,8,0,1,1)
grid.addWidget(value4,8,1,1,1)
value4 = QtGui.QPushButton(translate("Arch","Switch Length/Height"))
grid.addWidget(value4,7,0,1,1)
value5 = QtGui.QPushButton(translate("Arch","Switch Length/Width"))
grid.addWidget(value5,7,1,1,1)
# connect slots
QtCore.QObject.connect(self.valuec,QtCore.SIGNAL("currentIndexChanged(int)"),self.setCategory)
@@ -527,9 +516,8 @@ class _CommandStructure:
QtCore.QObject.connect(self.vLength,QtCore.SIGNAL("valueChanged(double)"),self.setLength)
QtCore.QObject.connect(self.vWidth,QtCore.SIGNAL("valueChanged(double)"),self.setWidth)
QtCore.QObject.connect(self.vHeight,QtCore.SIGNAL("valueChanged(double)"),self.setHeight)
QtCore.QObject.connect(value4,QtCore.SIGNAL("stateChanged(int)"),self.setContinue)
QtCore.QObject.connect(value5,QtCore.SIGNAL("pressed()"),self.rotateLH)
QtCore.QObject.connect(value6,QtCore.SIGNAL("pressed()"),self.rotateLW)
QtCore.QObject.connect(value4,QtCore.SIGNAL("pressed()"),self.rotateLH)
QtCore.QObject.connect(value5,QtCore.SIGNAL("pressed()"),self.rotateLW)
QtCore.QObject.connect(self.modeb,QtCore.SIGNAL("toggled(bool)"),self.switchLH)
# restore preset
@@ -602,11 +590,6 @@ class _CommandStructure:
else:
params.set_param_arch("StructureLength",d)
def setContinue(self,i):
self.continueCmd = bool(i)
params.set_param("ContinueMode", bool(i))
def setCategory(self,i):
self.vPresets.clear()

View File

@@ -38,6 +38,7 @@ class BIM_Beam(ArchStructure._CommandStructure):
def __init__(self):
super().__init__()
self.beammode = True
self.featureName = "Beam"
def IsActive(self):
v = hasattr(FreeCADGui.getMainWindow().getActiveWindow(), "getSceneGraph")

View File

@@ -38,6 +38,7 @@ class BIM_Column(ArchStructure._CommandStructure):
def __init__(self):
super().__init__()
self.beammode = False
self.featureName = "Column"
def IsActive(self):
v = hasattr(FreeCADGui.getMainWindow().getActiveWindow(), "getSceneGraph")

View File

@@ -70,7 +70,7 @@ class Arch_Panel:
self.Width = params.get_param_arch("PanelWidth")
self.Thickness = params.get_param_arch("PanelThickness")
self.Profile = None
self.continueCmd = False
self.featureName = "Panel"
self.rotated = False
sel = FreeCADGui.Selection.getSelection()
if sel:
@@ -96,7 +96,9 @@ class Arch_Panel:
self.tracker.height(self.Thickness)
self.tracker.length(self.Length)
self.tracker.on()
FreeCAD.activeDraftCommand = self
FreeCADGui.Snapper.getPoint(callback=self.getPoint,movecallback=self.update,extradlg=self.taskbox())
FreeCADGui.draftToolBar.continueCmd.show()
def getPoint(self,point=None,obj=None):
@@ -105,6 +107,7 @@ class Arch_Panel:
import DraftVecUtils
self.tracker.finalize()
if point is None:
FreeCAD.activeDraftCommand = None
return
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Panel"))
FreeCADGui.addModule("Arch")
@@ -120,7 +123,8 @@ class Arch_Panel:
FreeCADGui.doCommand('s.Placement.Rotation = FreeCAD.Rotation(FreeCAD.Vector(1.00,0.00,0.00),90.00)')
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
if self.continueCmd:
FreeCAD.activeDraftCommand = None
if FreeCADGui.draftToolBar.continueCmd.isChecked():
self.Activated()
def taskbox(self):
@@ -166,26 +170,14 @@ class Arch_Panel:
grid.addWidget(self.vHeight,3,1,1,1)
# horizontal button
value5 = QtGui.QPushButton(translate("Arch","Rotate"))
grid.addWidget(value5,4,0,1,2)
# continue button
label4 = QtGui.QLabel(translate("Arch","Con&tinue"))
value4 = QtGui.QCheckBox()
value4.setObjectName("ContinueCmd")
value4.setLayoutDirection(QtCore.Qt.RightToLeft)
label4.setBuddy(value4)
self.continueCmd = params.get_param("ContinueMode")
value4.setChecked(self.continueCmd)
grid.addWidget(label4,5,0,1,1)
grid.addWidget(value4,5,1,1,1)
value4= QtGui.QPushButton(translate("Arch","Rotate"))
grid.addWidget(value4,4,0,1,2)
valuep.currentIndexChanged.connect(self.setPreset)
self.vLength.valueChanged.connect(self.setLength)
self.vWidth.valueChanged.connect(self.setWidth)
self.vHeight.valueChanged.connect(self.setThickness)
value4.stateChanged.connect(self.setContinue)
value5.pressed.connect(self.rotate)
value4.pressed.connect(self.rotate)
return w
def update(self,point,info):
@@ -221,12 +213,6 @@ class Arch_Panel:
self.Length = d.Value
params.set_param_arch("PanelLength",d)
def setContinue(self,i):
from draftutils import params
self.continueCmd = bool(i)
params.set_param("ContinueMode", bool(i))
def setPreset(self,i):
if i > 0:

View File

@@ -75,7 +75,7 @@ class Arch_Wall:
self.MultiMat = None
self.Length = None
self.lengthValue = 0
self.continueCmd = False
self.featureName = "Wall"
self.Width = params.get_param_arch("WallWidth")
self.Height = params.get_param_arch("WallHeight")
self.JOIN_WALLS_SKETCHES = params.get_param_arch("joinWallSketches")
@@ -118,6 +118,7 @@ class Arch_Wall:
FreeCADGui.Snapper.getPoint(callback=self.getPoint,
extradlg=self.taskbox(),
title=translate("Arch","First point of wall")+":")
FreeCADGui.draftToolBar.continueCmd.show()
def getPoint(self,point=None,obj=None):
"""Callback for clicks during interactive mode.
@@ -194,7 +195,7 @@ class Arch_Wall:
FreeCAD.ActiveDocument.recompute()
# gui_utils.end_all_events() # Causes a crash on Linux.
self.tracker.finalize()
if self.continueCmd:
if FreeCADGui.draftToolBar.continueCmd.isChecked():
self.Activated()
def addDefault(self):
@@ -319,31 +320,20 @@ class Arch_Wall:
grid.addWidget(label3,4,0,1,1)
grid.addWidget(value3,4,1,1,1)
label4 = QtGui.QLabel(translate("Arch","Con&tinue"))
label4 = QtGui.QLabel(translate("Arch","Use sketches"))
value4 = QtGui.QCheckBox()
value4.setObjectName("ContinueCmd")
value4.setObjectName("UseSketches")
value4.setLayoutDirection(QtCore.Qt.RightToLeft)
label4.setBuddy(value4)
self.continueCmd = params.get_param("ContinueMode")
value4.setChecked(self.continueCmd)
value4.setChecked(params.get_param_arch("WallSketches"))
grid.addWidget(label4,5,0,1,1)
grid.addWidget(value4,5,1,1,1)
label5 = QtGui.QLabel(translate("Arch","Use sketches"))
value5 = QtGui.QCheckBox()
value5.setObjectName("UseSketches")
value5.setLayoutDirection(QtCore.Qt.RightToLeft)
label5.setBuddy(value5)
value5.setChecked(params.get_param_arch("WallSketches"))
grid.addWidget(label5,6,0,1,1)
grid.addWidget(value5,6,1,1,1)
self.Length.valueChanged.connect(self.setLength)
value1.valueChanged.connect(self.setWidth)
value2.valueChanged.connect(self.setHeight)
value3.currentIndexChanged.connect(self.setAlign)
value4.stateChanged.connect(self.setContinue)
value5.stateChanged.connect(self.setUseSketch)
value4.stateChanged.connect(self.setUseSketch)
self.Length.returnPressed.connect(value1.setFocus)
self.Length.returnPressed.connect(value1.selectAll)
value1.returnPressed.connect(value2.setFocus)
@@ -397,16 +387,6 @@ class Arch_Wall:
self.Align = ["Center","Left","Right"][i]
params.set_param_arch("WallAlignment",i)
def setContinue(self,i):
"""Simple callback to set if the interactive mode will restart when finished.
This allows for several walls to be placed one after another.
"""
from draftutils import params
self.continueCmd = bool(i)
params.set_param("ContinueMode", bool(i))
def setUseSketch(self,i):
"""Simple callback to set if walls should based on sketches."""