BIM: Improve grid handling for some commands (#20658)

* BIM: Improve grid handling for some commands

The updated commands did not handle the 2 grid options ("always", "only during commands") correctly. The proposed code follows the example of BimWall.py and ArchStructure.py where this issue has already been addressed.

* Rebase
This commit is contained in:
Roy-043
2025-04-25 14:59:33 +02:00
committed by GitHub
parent 986a3b4f7a
commit fc90443b98
7 changed files with 42 additions and 25 deletions

View File

@@ -47,8 +47,11 @@ class BIM_Box:
return v
def Activated(self):
import WorkingPlane
import draftguitools.gui_trackers as DraftTrackers
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
self.wp = WorkingPlane.get_working_plane()
# here we will store our points
self.points = []
# we build a special cube tracker which is a list of 4 rectangle trackers
@@ -247,19 +250,12 @@ class BIM_Box:
# finally we turn all rectangles on
for r in self.cubetracker:
r.on()
if hasattr(FreeCAD, "DraftWorkingPlane"):
FreeCAD.DraftWorkingPlane.save()
FreeCAD.DraftWorkingPlane.position = self.cubetracker[0].p3()
FreeCAD.DraftWorkingPlane.u = (
self.cubetracker[0].p3().sub(self.cubetracker[0].p4())
).normalize()
FreeCAD.DraftWorkingPlane.v = self.normal
FreeCAD.DraftWorkingPlane.axis = (
self.cubetracker[0].p2().sub(self.cubetracker[0].p3())
).normalize()
FreeCADGui.Snapper.setGrid()
point = self.cubetracker[0].p3()
axis = self.cubetracker[0].p2().sub(self.cubetracker[0].p3())
self.wp._save()
self.wp.align_to_point_and_axis(point, axis, upvec=self.normal, _hist_add=False)
FreeCADGui.Snapper.getPoint(
last=self.cubetracker[0].p3(),
last=point,
callback=self.PointCallback,
movecallback=self.MoveCallback,
extradlg=self.taskbox(),
@@ -291,15 +287,11 @@ class BIM_Box:
doc.recompute()
def _finish(self):
FreeCADGui.Snapper.getPoint()
self.wp._restore()
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
for c in self.cubetracker:
c.finalize()
if hasattr(FreeCADGui, "draftToolBar"):
FreeCADGui.draftToolBar.offUi()
if hasattr(FreeCAD, "DraftWorkingPlane"):
FreeCAD.DraftWorkingPlane.restore()
FreeCADGui.Snapper.setGrid()
FreeCADGui.addCommand("BIM_Box", BIM_Box())

View File

@@ -67,6 +67,7 @@ class Arch_CurtainWall:
FreeCAD.ActiveDocument.recompute()
else:
# interactive line drawing
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
self.points = []
import WorkingPlane
WorkingPlane.get_working_plane()
@@ -79,11 +80,15 @@ class Arch_CurtainWall:
if point is None:
# cancelled
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
return
self.points.append(point)
if len(self.points) == 1:
FreeCADGui.Snapper.getPoint(last=self.points[0],callback=self.getPoint)
elif len(self.points) == 2:
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Curtain Wall"))
FreeCADGui.addModule("Draft")

View File

@@ -59,6 +59,7 @@ class BIM_ImagePlane:
translate("BIM", "Image file (*.png *.jpg *.bmp)"),
)
if filename:
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
self.filename = filename
im = QtGui.QImage(self.filename)
self.proportion = float(im.height()) / float(im.width())
@@ -88,6 +89,8 @@ class BIM_ImagePlane:
if not point:
# cancelled
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
self.tracker.off()
return
elif not self.basepoint:
@@ -100,6 +103,8 @@ class BIM_ImagePlane:
)
else:
# this is our second point
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
self.tracker.off()
midpoint = self.basepoint.add(
self.opposite.sub(self.basepoint).multiply(0.5)
@@ -109,7 +114,7 @@ class BIM_ImagePlane:
length = DraftVecUtils.project(diagonal, FreeCAD.DraftWorkingPlane.u).Length
height = DraftVecUtils.project(diagonal, FreeCAD.DraftWorkingPlane.v).Length
FreeCAD.ActiveDocument.openTransaction("Create image plane")
image = FreeCAD.activeDocument().addObject(
image = FreeCAD.ActiveDocument.addObject(
"Image::ImagePlane", "ImagePlane"
)
image.Label = os.path.splitext(os.path.basename(self.filename))[0]

View File

@@ -88,15 +88,15 @@ class Arch_Panel:
return
# interactive mode
WorkingPlane.get_working_plane()
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
WorkingPlane.get_working_plane()
self.points = []
self.tracker = DraftTrackers.boxTracker()
self.tracker.width(self.Width)
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()
@@ -105,9 +105,11 @@ class Arch_Panel:
"this function is called by the snapper when it has a 3D point"
import DraftVecUtils
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
self.tracker.finalize()
if point is None:
FreeCAD.activeDraftCommand = None
return
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Panel"))
FreeCADGui.addModule("Arch")
@@ -123,7 +125,6 @@ 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()
FreeCAD.activeDraftCommand = None
if FreeCADGui.draftToolBar.continueCmd.isChecked():
self.Activated()

View File

@@ -52,6 +52,8 @@ class Arch_Profile:
def Activated(self):
import ArchProfile
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
self.Profile = None
self.Categories = []
self.Presets = ArchProfile.readPresets()
@@ -109,6 +111,8 @@ class Arch_Profile:
"this function is called by the snapper when it has a 3D point"
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
if not point:
return
if not self.Profile:

View File

@@ -60,8 +60,10 @@ class Arch_Truss:
self.createTruss(basename)
else:
# interactive line drawing
self.points = []
import WorkingPlane
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
self.points = []
WorkingPlane.get_working_plane()
if hasattr(FreeCADGui,"Snapper"):
FreeCADGui.Snapper.getPoint(callback=self.getPoint)
@@ -72,11 +74,15 @@ class Arch_Truss:
if point is None:
# cancelled
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
return
self.points.append(point)
if len(self.points) == 1:
FreeCADGui.Snapper.getPoint(last=self.points[0],callback=self.getPoint)
elif len(self.points) == 2:
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
self.createTruss()
def createTruss(self, basename=""):

View File

@@ -127,8 +127,9 @@ class Arch_Window:
return
# interactive mode
self.wp = WorkingPlane.get_working_plane()
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
self.wp = WorkingPlane.get_working_plane()
self.tracker = DraftTrackers.boxTracker()
self.tracker.length(self.Width)
self.tracker.width(self.W1)
@@ -160,6 +161,9 @@ class Arch_Window:
from draftutils import gui_utils
from draftutils.messages import _wrn
from ArchWindowPresets import WindowPresets
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
self.tracker.off()
if point is None:
return