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:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user