Skip to content

Commit

Permalink
Added support for copying holding tags from another holding tags dres…
Browse files Browse the repository at this point in the history
…sup.
  • Loading branch information
mlampert committed Oct 16, 2019
1 parent fa5d345 commit 453f80f
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 48 deletions.
94 changes: 56 additions & 38 deletions src/Mod/Path/Gui/Resources/panels/HoldingTagsEdit.ui
Expand Up @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>399</width>
<height>582</height>
<width>289</width>
<height>466</height>
</rect>
</property>
<property name="windowTitle">
Expand All @@ -17,6 +17,12 @@
<item row="2" column="0">
<widget class="QWidget" name="removeEditAddGroup" native="true">
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<item row="1" column="2">
<widget class="QPushButton" name="pbAdd">
<property name="text">
Expand Down Expand Up @@ -44,42 +50,6 @@
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QGroupBox" name="cbTagGeneration">
<property name="title">
<string>Auto Generate</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="1">
<widget class="QSpinBox" name="sbCount">
<property name="minimum">
<number>2</number>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="pbGenerate">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Replace All</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Number of Tags</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
Expand Down Expand Up @@ -167,6 +137,54 @@
</layout>
</widget>
</item>
<item row="4" column="0">
<widget class="QGroupBox" name="gbCopy">
<property name="enabled">
<bool>false</bool>
</property>
<property name="title">
<string>Copy From</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QComboBox" name="cbSource"/>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="pbCopy">
<property name="text">
<string>Replace All</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<widget class="QGroupBox" name="cbTagGeneration">
<property name="title">
<string>Auto Generate</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<widget class="QSpinBox" name="sbCount">
<property name="minimum">
<number>2</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pbGenerate">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Replace All</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
Expand Down
52 changes: 42 additions & 10 deletions src/Mod/Path/PathScripts/PathDressupHoldingTags.py
Expand Up @@ -36,13 +36,8 @@
from PathScripts.PathUtils import waiting_effects
from PySide import QtCore

LOGLEVEL = False

if LOGLEVEL:
PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
PathLog.trackModule()
else:
PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule())
PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule())
#PathLog.trackModule()

failures = []

Expand Down Expand Up @@ -144,7 +139,7 @@ def createSolidsAt(self, z, R):
self.isSquare = True
self.solid = Part.makeCylinder(r1, height)
radius = min(min(self.radius, r1), self.height)
PathLog.debug("Part.makeCone(%f, %f)" % (r1, height))
PathLog.debug("Part.makeCylinder(%f, %f)" % (r1, height))
elif self.angle > 0.0 and height > 0.0:
# cone
rad = math.radians(self.angle)
Expand Down Expand Up @@ -609,9 +604,9 @@ def generateTags(self, obj, count, width=None, height=None, angle=None, radius=N
else:
tagDistance = self.baseWire.Length / (count if count else 4)

W = width if width else self.defaultTagWidth()
W = width if width else self.defaultTagWidth()
H = height if height else self.defaultTagHeight()
A = angle if angle else self.defaultTagAngle()
A = angle if angle else self.defaultTagAngle()
R = radius if radius else self.defaultTagRadius()

# start assigning tags on the longest segment
Expand Down Expand Up @@ -663,6 +658,31 @@ def generateTags(self, obj, count, width=None, height=None, angle=None, radius=N

return tags

def copyTags(self, obj, fromObj, width, height, angle, radius):
print("copyTags(%s, %s, %.2f, %.2f, %.2f, %.2f" % (obj.Label, fromObj.Label, width, height, angle, radius))
W = width if width else self.defaultTagWidth()
H = height if height else self.defaultTagHeight()
A = angle if angle else self.defaultTagAngle()
R = radius if radius else self.defaultTagRadius()

tags = []
j = 0
for i, pos in enumerate(fromObj.Positions):
print("tag[%d]" % i)
if not i in fromObj.Disabled:
dist = self.baseWire.distToShape(Part.Vertex(FreeCAD.Vector(pos.x, pos.y, self.minZ)))
if dist[0] < W:
print("tag[%d/%d]: (%.2f, %.2f, %.2f)" % (i, j, pos.x, pos.y, self.minZ))
at = dist[1][0][0]
tags.append(Tag(j, at.x, at.y, W, H, A, R, True))
j += 1
else:
PathLog.warning("Tag[%d] (%.2f, %.2f, %.2f) is too far away to copy: %.2f (%.2f)" % (i, pos.x, pos.y, self.minZ, dist[0], W))
else:
PathLog.info("tag[%d]: not enabled, skipping" % i)
print("copied %d tags" % len(tags))
return tags

def processEdge(self, index, edge, currentLength, lastTagLength, tagDistance, minLength, edgeDict):
tagCount = 0
currentLength += edge.Length
Expand Down Expand Up @@ -781,6 +801,18 @@ def generateTags(self, obj, count):
obj.Disabled = []
return False

def copyTags(self, obj, fromObj):
obj.Width = fromObj.Width
obj.Height = fromObj.Height
obj.Angle = fromObj.Angle
obj.Radius = fromObj.Radius
obj.SegmentationFactor = fromObj.SegmentationFactor

self.tags = self.pathData.copyTags(obj, fromObj, obj.Width.Value, obj.Height.Value, obj.Angle, obj.Radius.Value)
obj.Positions = [tag.originAt(self.pathData.minZ) for tag in self.tags]
obj.Disabled = []
return False

def isValidTagStartIntersection(self, edge, i):
if PathGeom.pointsCoincide(i, edge.valueAt(edge.LastParameter)):
return False
Expand Down
21 changes: 21 additions & 0 deletions src/Mod/Path/PathScripts/PathDressupTagGui.py
Expand Up @@ -191,6 +191,18 @@ def generateNewTags(self):
self.Disabled = self.obj.Disabled
self.updateTagsView()

def copyNewTags(self):
sel = self.form.cbSource.currentText()
tags = [o for o in FreeCAD.ActiveDocument.Objects if sel == o.Label]
if 1 == len(tags):
if not self.obj.Proxy.copyTags(self.obj, tags[0]):
self.obj.Proxy.execute(self.obj)
self.Positions = self.obj.Positions
self.Disabled = self.obj.Disabled
self.updateTagsView()
else:
PathLog.error(translate('Path_DressupTag', 'Cannot copy tags - internal error')+'\n')

def updateModel(self):
self.getFields()
self.updateTagsView()
Expand Down Expand Up @@ -279,6 +291,15 @@ def setupUi(self):
else:
self.form.cbTagGeneration.setEnabled(False)

enableCopy = False
for tags in sorted([o.Label for o in FreeCAD.ActiveDocument.Objects if 'DressupTag' in o.Name]):
if tags != self.obj.Label:
enableCopy = True
self.form.cbSource.addItem(tags)
if enableCopy:
self.form.gbCopy.setEnabled(True)
self.form.pbCopy.clicked.connect(self.copyNewTags)

self.form.lwTags.itemChanged.connect(self.whenTagsViewChanged)
self.form.lwTags.itemSelectionChanged.connect(self.whenTagSelectionChanged)
self.form.lwTags.itemActivated.connect(self.editTag)
Expand Down

0 comments on commit 453f80f

Please sign in to comment.