Merge branch 'master' of ssh://free-cad.git.sourceforge.net/gitroot/free-cad/free-cad
This commit is contained in:
commit
6665383f49
|
@ -170,14 +170,21 @@ class Snapper:
|
|||
self.tracker.off()
|
||||
if self.extLine:
|
||||
self.extLine.off()
|
||||
if self.trackLine:
|
||||
self.trackLine.off()
|
||||
|
||||
point = self.getApparentPoint(screenpos[0],screenpos[1])
|
||||
|
||||
# setup a track line if we got a last point
|
||||
if lastpoint:
|
||||
if not self.trackLine:
|
||||
self.trackLine = DraftTrackers.lineTracker()
|
||||
self.trackLine.p1(lastpoint)
|
||||
|
||||
# check if we snapped to something
|
||||
self.snapInfo = Draft.get3DView().getObjectInfo((screenpos[0],screenpos[1]))
|
||||
|
||||
# checking if parallel to one of the edges of the last objects or to a polar direction
|
||||
|
||||
if active:
|
||||
eline = None
|
||||
point,eline = self.snapToPolar(point,lastpoint)
|
||||
|
@ -188,7 +195,11 @@ class Snapper:
|
|||
# nothing has been snapped, check fro grid snap
|
||||
if active:
|
||||
point = self.snapToGrid(point)
|
||||
return cstr(point)
|
||||
fp = cstr(point)
|
||||
if self.trackLine and lastpoint:
|
||||
self.trackLine.p2(fp)
|
||||
self.trackLine.on()
|
||||
return fp
|
||||
|
||||
else:
|
||||
|
||||
|
@ -308,10 +319,16 @@ class Snapper:
|
|||
self.tracker.setCoords(winner[2])
|
||||
self.tracker.setMarker(self.mk[winner[1]])
|
||||
self.tracker.on()
|
||||
# setting the trackline
|
||||
fp = cstr(winner[2])
|
||||
if self.trackLine and lastpoint:
|
||||
self.trackLine.p2(fp)
|
||||
self.trackLine.on()
|
||||
# set the cursor
|
||||
self.setCursor(winner[1])
|
||||
|
||||
|
||||
# return the final point
|
||||
return cstr(winner[2])
|
||||
return fp
|
||||
|
||||
def getApparentPoint(self,x,y):
|
||||
"returns a 3D point, projected on the current working plane"
|
||||
|
@ -439,15 +456,14 @@ class Snapper:
|
|||
if self.isEnabled("grid"):
|
||||
np = self.grid.getClosestNode(point)
|
||||
if np:
|
||||
if self.radius != 0:
|
||||
dv = point.sub(np)
|
||||
if dv.Length <= self.radius:
|
||||
if self.tracker:
|
||||
self.tracker.setCoords(np)
|
||||
self.tracker.setMarker(self.mk['grid'])
|
||||
self.tracker.on()
|
||||
self.setCursor('grid')
|
||||
return np
|
||||
dv = point.sub(np)
|
||||
if (self.radius == 0) or (dv.Length <= self.radius):
|
||||
if self.tracker:
|
||||
self.tracker.setCoords(np)
|
||||
self.tracker.setMarker(self.mk['grid'])
|
||||
self.tracker.on()
|
||||
self.setCursor('grid')
|
||||
return np
|
||||
return point
|
||||
|
||||
def snapToEndpoints(self,shape):
|
||||
|
@ -663,6 +679,8 @@ class Snapper:
|
|||
"finishes snapping"
|
||||
if self.tracker:
|
||||
self.tracker.off()
|
||||
if self.trackLine:
|
||||
self.trackLine.off()
|
||||
if self.extLine:
|
||||
self.extLine.off()
|
||||
if self.radiusTracker:
|
||||
|
@ -777,13 +795,6 @@ class Snapper:
|
|||
self.ui = FreeCADGui.draftToolBar
|
||||
self.view = Draft.get3DView()
|
||||
|
||||
# setting a track line if we got an existing point
|
||||
if last:
|
||||
if not self.trackLine:
|
||||
self.trackLine = DraftTrackers.lineTracker()
|
||||
self.trackLine.p1(last)
|
||||
self.trackLine.on()
|
||||
|
||||
def move(event_cb):
|
||||
event = event_cb.getEvent()
|
||||
mousepos = event.getPosition()
|
||||
|
@ -792,8 +803,6 @@ class Snapper:
|
|||
self.pt = FreeCADGui.Snapper.snap(mousepos,lastpoint=last,active=ctrl,constrain=shift)
|
||||
if hasattr(FreeCAD,"DraftWorkingPlane"):
|
||||
self.ui.displayPoint(self.pt,last,plane=FreeCAD.DraftWorkingPlane,mask=FreeCADGui.Snapper.affinity)
|
||||
if self.trackLine:
|
||||
self.trackLine.p2(self.pt)
|
||||
if movecallback:
|
||||
movecallback(self.pt)
|
||||
|
||||
|
@ -816,8 +825,6 @@ class Snapper:
|
|||
obj = FreeCADGui.Snapper.lastSnappedObject
|
||||
FreeCADGui.Snapper.off()
|
||||
self.ui.offUi()
|
||||
if self.trackLine:
|
||||
self.trackLine.off()
|
||||
if callback:
|
||||
if len(inspect.getargspec(callback).args) > 2:
|
||||
callback(self.pt,obj)
|
||||
|
@ -830,8 +837,6 @@ class Snapper:
|
|||
self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove)
|
||||
FreeCADGui.Snapper.off()
|
||||
self.ui.offUi()
|
||||
if self.trackLine:
|
||||
self.trackLine.off()
|
||||
if callback:
|
||||
callback(None)
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -401,32 +401,72 @@ class ghostTracker(Tracker):
|
|||
self.trans = coin.SoTransform()
|
||||
self.trans.translation.setValue([0,0,0])
|
||||
self.children = [self.trans]
|
||||
self.ivsep = coin.SoSeparator()
|
||||
try:
|
||||
if isinstance(sel,Part.Shape):
|
||||
ivin = coin.SoInput()
|
||||
ivin.setBuffer(sel.writeInventor())
|
||||
ivob = coin.SoDB.readAll(ivin)
|
||||
self.ivsep.addChild(ivob.getChildren()[1])
|
||||
else:
|
||||
if not isinstance(sel,list):
|
||||
sel = [sel]
|
||||
for obj in sel:
|
||||
self.ivsep.addChild(obj.ViewObject.RootNode.copy())
|
||||
except:
|
||||
print "draft: Couldn't create ghost"
|
||||
self.children.append(self.ivsep)
|
||||
rootsep = coin.SoSeparator()
|
||||
if not isinstance(sel,list):
|
||||
sel = [sel]
|
||||
for obj in sel:
|
||||
rootsep.addChild(self.getNode(obj))
|
||||
self.children.append(rootsep)
|
||||
Tracker.__init__(self,children=self.children)
|
||||
|
||||
def update(self,obj):
|
||||
"recreates the ghost from a new object"
|
||||
obj.ViewObject.show()
|
||||
self.finalize()
|
||||
self.ivsep = coin.SoSeparator()
|
||||
self.ivsep.addChild(obj.ViewObject.RootNode.copy())
|
||||
Tracker.__init__(self,children=[self.ivsep])
|
||||
sep = getNode(obj)
|
||||
Tracker.__init__(self,children=[self.sep])
|
||||
self.on()
|
||||
obj.ViewObject.hide()
|
||||
|
||||
def move(self,delta):
|
||||
"moves the ghost to a given position, relative from its start position"
|
||||
self.trans.translation.setValue([delta.x,delta.y,delta.z])
|
||||
|
||||
def rotate(self,axis,angle):
|
||||
"rotates the ghost of a given angle"
|
||||
self.trans.rotation.setValue(coin.SbVec3f(DraftVecUtils.tup(axis)),angle)
|
||||
|
||||
def center(self,point):
|
||||
"sets the rotation/scale center of the ghost"
|
||||
self.trans.center.setValue(point.x,point.y,point.z)
|
||||
|
||||
def scale(self,delta):
|
||||
"scales the ghost by the given factor"
|
||||
self.trans.scaleFactor.setValue([delta.x,delta.y,delta.z])
|
||||
|
||||
def getNode(self,obj):
|
||||
"returns a coin node representing the given object"
|
||||
if isinstance(obj,Part.Shape):
|
||||
return self.getNodeLight(obj)
|
||||
elif obj.isDerivedFrom("Part::Feature"):
|
||||
return self.getNodeFull(obj)
|
||||
else:
|
||||
return self.getNodeFull(obj)
|
||||
|
||||
def getNode(self,obj):
|
||||
"gets a coin node which is a full copy of the current representation"
|
||||
sep = coin.SoSeparator()
|
||||
try:
|
||||
sep.addChild(obj.ViewObject.RootNode.copy())
|
||||
except:
|
||||
pass
|
||||
return sep
|
||||
|
||||
def getNodeLight(self,shape):
|
||||
"extract a lighter version directly from a shape"
|
||||
# very error-prone, will be obsoleted ASAP
|
||||
sep = coin.SoSeparator()
|
||||
try:
|
||||
inputstr = coin.SoInput()
|
||||
inputstr.setBuffer(shape.writeInventor())
|
||||
coinobj = coin.SoDB.readAll(inputstr)
|
||||
# only add wireframe or full node?
|
||||
sep.addChild(coinobj.getChildren()[1])
|
||||
# sep.addChild(coinobj)
|
||||
except:
|
||||
pass
|
||||
return sep
|
||||
|
||||
class editTracker(Tracker):
|
||||
"A node edit tracker"
|
||||
def __init__(self,pos=Vector(0,0,0),name="None",idx=0,objcol=None):
|
||||
|
|
|
@ -93,12 +93,6 @@ TaskLinearPatternParameters::TaskLinearPatternParameters(TaskMultiTransformParam
|
|||
|
||||
void TaskLinearPatternParameters::setupUI()
|
||||
{
|
||||
connect(ui->buttonX, SIGNAL(pressed()),
|
||||
this, SLOT(onButtonX()));
|
||||
connect(ui->buttonY, SIGNAL(pressed()),
|
||||
this, SLOT(onButtonY()));
|
||||
connect(ui->buttonZ, SIGNAL(pressed()),
|
||||
this, SLOT(onButtonZ()));
|
||||
connect(ui->checkReverse, SIGNAL(toggled(bool)),
|
||||
this, SLOT(onCheckReverse(bool)));
|
||||
connect(ui->spinLength, SIGNAL(valueChanged(double)),
|
||||
|
@ -125,9 +119,9 @@ void TaskLinearPatternParameters::setupUI()
|
|||
}
|
||||
// ---------------------
|
||||
|
||||
ui->buttonX->setEnabled(true);
|
||||
ui->buttonY->setEnabled(true);
|
||||
ui->buttonZ->setEnabled(true);
|
||||
//ui->buttonX->setEnabled(true);
|
||||
//ui->buttonY->setEnabled(true);
|
||||
//ui->buttonZ->setEnabled(true);
|
||||
ui->checkReverse->setEnabled(true);
|
||||
ui->spinLength->setEnabled(true);
|
||||
ui->spinOccurrences->setEnabled(true);
|
||||
|
@ -154,20 +148,20 @@ void TaskLinearPatternParameters::updateUI()
|
|||
ui->buttonReference->setChecked(referenceSelectionMode);
|
||||
if (!stdDirection.empty())
|
||||
{
|
||||
ui->buttonX->setAutoExclusive(true);
|
||||
ui->buttonY->setAutoExclusive(true);
|
||||
ui->buttonZ->setAutoExclusive(true);
|
||||
ui->buttonX->setChecked(stdDirection == "X");
|
||||
ui->buttonY->setChecked(stdDirection == "Y");
|
||||
ui->buttonZ->setChecked(stdDirection == "Z");
|
||||
//ui->buttonX->setAutoExclusive(true);
|
||||
//ui->buttonY->setAutoExclusive(true);
|
||||
//ui->buttonZ->setAutoExclusive(true);
|
||||
//ui->buttonX->setChecked(stdDirection == "X");
|
||||
//ui->buttonY->setChecked(stdDirection == "Y");
|
||||
//ui->buttonZ->setChecked(stdDirection == "Z");
|
||||
ui->lineReference->setText(tr(""));
|
||||
} else if (directionFeature != NULL && !directions.empty()) {
|
||||
ui->buttonX->setAutoExclusive(false);
|
||||
ui->buttonY->setAutoExclusive(false);
|
||||
ui->buttonZ->setAutoExclusive(false);
|
||||
ui->buttonX->setChecked(false);
|
||||
ui->buttonY->setChecked(false);
|
||||
ui->buttonZ->setChecked(false);
|
||||
//ui->buttonX->setAutoExclusive(false);
|
||||
//ui->buttonY->setAutoExclusive(false);
|
||||
//ui->buttonZ->setAutoExclusive(false);
|
||||
//ui->buttonX->setChecked(false);
|
||||
//ui->buttonY->setChecked(false);
|
||||
//ui->buttonZ->setChecked(false);
|
||||
ui->lineReference->setText(QString::fromAscii(directions.front().c_str()));
|
||||
} else {
|
||||
// Error message?
|
||||
|
@ -220,17 +214,17 @@ void TaskLinearPatternParameters::onSelectionChanged(const Gui::SelectionChanges
|
|||
}
|
||||
}
|
||||
|
||||
void TaskLinearPatternParameters::onButtonX() {
|
||||
onStdDirection("X");
|
||||
}
|
||||
|
||||
void TaskLinearPatternParameters::onButtonY() {
|
||||
onStdDirection("Y");
|
||||
}
|
||||
|
||||
void TaskLinearPatternParameters::onButtonZ() {
|
||||
onStdDirection("Z");
|
||||
}
|
||||
//void TaskLinearPatternParameters::onButtonX() {
|
||||
// onStdDirection("X");
|
||||
//}
|
||||
//
|
||||
//void TaskLinearPatternParameters::onButtonY() {
|
||||
// onStdDirection("Y");
|
||||
//}
|
||||
//
|
||||
//void TaskLinearPatternParameters::onButtonZ() {
|
||||
// onStdDirection("Z");
|
||||
//}
|
||||
|
||||
void TaskLinearPatternParameters::onCheckReverse(const bool on) {
|
||||
if (blockUpdate)
|
||||
|
@ -321,12 +315,12 @@ void TaskLinearPatternParameters::onUpdateView(bool on)
|
|||
|
||||
const std::string TaskLinearPatternParameters::getStdDirection(void) const
|
||||
{
|
||||
if (ui->buttonX->isChecked())
|
||||
return std::string("X");
|
||||
else if (ui->buttonY->isChecked())
|
||||
return std::string("Y");
|
||||
else if (ui->buttonZ->isChecked())
|
||||
return std::string("Z");
|
||||
//if (ui->buttonX->isChecked())
|
||||
// return std::string("X");
|
||||
//else if (ui->buttonY->isChecked())
|
||||
// return std::string("Y");
|
||||
//else if (ui->buttonZ->isChecked())
|
||||
// return std::string("Z");
|
||||
return std::string("");
|
||||
}
|
||||
|
||||
|
|
|
@ -64,9 +64,9 @@ public:
|
|||
|
||||
private Q_SLOTS:
|
||||
void onStdDirection(const std::string& dir);
|
||||
void onButtonX();
|
||||
void onButtonY();
|
||||
void onButtonZ();
|
||||
//void onButtonX();
|
||||
//void onButtonY();
|
||||
//void onButtonZ();
|
||||
void onCheckReverse(const bool on);
|
||||
void onLength(const double l);
|
||||
void onOccurrences(const int n);
|
||||
|
|
|
@ -28,34 +28,6 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="buttonX">
|
||||
<property name="text">
|
||||
<string>X</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="buttonY">
|
||||
<property name="text">
|
||||
<string>Y</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="buttonZ">
|
||||
<property name="text">
|
||||
<string>Z</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
|
@ -97,6 +69,9 @@
|
|||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>5.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>100.000000000000000</double>
|
||||
</property>
|
||||
|
|
Loading…
Reference in New Issue
Block a user