Merge pull request #2631 from mlampert/feature/holding-tags-copy

Path: Added support for copying holding tags from another holding tags dressup
This commit is contained in:
sliptonic
2019-10-20 07:52:58 -05:00
committed by GitHub
3 changed files with 119 additions and 48 deletions

View File

@@ -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">
@@ -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">
@@ -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>
@@ -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>

View File

@@ -36,13 +36,8 @@ from PathScripts.PathDressupTagPreferences import HoldingTagPreferences
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 = []
@@ -144,7 +139,7 @@ class Tag:
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)
@@ -609,9 +604,9 @@ class PathData:
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
@@ -663,6 +658,31 @@ class PathData:
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
@@ -781,6 +801,18 @@ class ObjectTagDressup:
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

View File

@@ -191,6 +191,18 @@ class PathDressupTagTaskPanel:
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()
@@ -279,6 +291,15 @@ class PathDressupTagTaskPanel:
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)