mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-12-29 10:50:35 +05:00
Implementation of Polyline dialog
This commit is contained in:
parent
37fd7c3872
commit
2b4e071923
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include "CurveCreator_Utils.hxx"
|
#include "CurveCreator_Utils.hxx"
|
||||||
#include "CurveCreator.hxx"
|
#include "CurveCreator.hxx"
|
||||||
|
#include "CurveCreator_Curve.hxx"
|
||||||
#include "CurveCreator_UtilsICurve.hxx"
|
#include "CurveCreator_UtilsICurve.hxx"
|
||||||
|
|
||||||
#include <GEOMUtils.hxx>
|
#include <GEOMUtils.hxx>
|
||||||
@ -41,9 +42,12 @@
|
|||||||
#include <Geom_Point.hxx>
|
#include <Geom_Point.hxx>
|
||||||
#include <Geom_BSplineCurve.hxx>
|
#include <Geom_BSplineCurve.hxx>
|
||||||
#include <Geom_Line.hxx>
|
#include <Geom_Line.hxx>
|
||||||
|
#include <Geom_Curve.hxx>
|
||||||
|
#include <Geom_TrimmedCurve.hxx>
|
||||||
|
|
||||||
#include <TopExp.hxx>
|
#include <TopExp.hxx>
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
|
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
||||||
#include <GeomAPI_ProjectPointOnCurve.hxx>
|
#include <GeomAPI_ProjectPointOnCurve.hxx>
|
||||||
#include <SelectMgr_EntityOwner.hxx>
|
#include <SelectMgr_EntityOwner.hxx>
|
||||||
#include <SelectMgr_Selection.hxx>
|
#include <SelectMgr_Selection.hxx>
|
||||||
@ -54,9 +58,11 @@
|
|||||||
#include <BRepBuilderAPI_MakeVertex.hxx>
|
#include <BRepBuilderAPI_MakeVertex.hxx>
|
||||||
#include <BRepBuilderAPI_MakeEdge.hxx>
|
#include <BRepBuilderAPI_MakeEdge.hxx>
|
||||||
#include <BRepBuilderAPI_MakeWire.hxx>
|
#include <BRepBuilderAPI_MakeWire.hxx>
|
||||||
|
#include <BRepTools_WireExplorer.hxx>
|
||||||
|
|
||||||
#include <TColgp_HArray1OfPnt.hxx>
|
#include <TColgp_HArray1OfPnt.hxx>
|
||||||
#include <TColStd_HArray1OfBoolean.hxx>
|
#include <TColStd_HArray1OfBoolean.hxx>
|
||||||
|
#include <TColStd_Array1OfReal.hxx>
|
||||||
#include <TColgp_Array1OfVec.hxx>
|
#include <TColgp_Array1OfVec.hxx>
|
||||||
#include <GeomAPI_Interpolate.hxx>
|
#include <GeomAPI_Interpolate.hxx>
|
||||||
|
|
||||||
@ -71,6 +77,48 @@ const double LOCAL_SELECTION_TOLERANCE = 0.0001;
|
|||||||
const int SCENE_PIXEL_PROJECTION_TOLERANCE = 10;
|
const int SCENE_PIXEL_PROJECTION_TOLERANCE = 10;
|
||||||
const int SCENE_PIXEL_POINT_TOLERANCE = 5;
|
const int SCENE_PIXEL_POINT_TOLERANCE = 5;
|
||||||
|
|
||||||
|
#define PLN_FREE 0
|
||||||
|
#define PLN_ORIGIN 1
|
||||||
|
#define PLN_OX 2
|
||||||
|
#define PLN_FIXED 3
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This static function returns the curve of original type from the edge.
|
||||||
|
*
|
||||||
|
* \param theEdge the edge
|
||||||
|
* \return the curve of original type. Can be null handle.
|
||||||
|
*/
|
||||||
|
static Handle(Geom_Curve) GetCurve(const TopoDS_Edge &theEdge)
|
||||||
|
{
|
||||||
|
Handle(Geom_Curve) aResult;
|
||||||
|
|
||||||
|
if (theEdge.IsNull()) {
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
Standard_Real aF;
|
||||||
|
Standard_Real aL;
|
||||||
|
|
||||||
|
aResult = BRep_Tool::Curve(theEdge, aF, aL);
|
||||||
|
|
||||||
|
if (aResult.IsNull()) {
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the curve of original type
|
||||||
|
Handle(Standard_Type) aType = aResult->DynamicType();
|
||||||
|
|
||||||
|
while (aType == STANDARD_TYPE(Geom_TrimmedCurve)) {
|
||||||
|
Handle(Geom_TrimmedCurve) aTrCurve =
|
||||||
|
Handle(Geom_TrimmedCurve)::DownCast(aResult);
|
||||||
|
|
||||||
|
aResult = aTrCurve->BasisCurve();
|
||||||
|
aType = aResult->DynamicType();
|
||||||
|
}
|
||||||
|
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
// function : ConvertClickToPoint()
|
// function : ConvertClickToPoint()
|
||||||
// purpose : Returns the point clicked in 3D view
|
// purpose : Returns the point clicked in 3D view
|
||||||
@ -245,6 +293,200 @@ void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve,
|
|||||||
theShape = aComp;
|
theShape = aComp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is an intermediate structure for curve construction.
|
||||||
|
*/
|
||||||
|
struct Section3D
|
||||||
|
{
|
||||||
|
Section3D() : myIsClosed(false), myIsBSpline(false)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
bool myIsClosed;
|
||||||
|
bool myIsBSpline;
|
||||||
|
Handle(TColgp_HArray1OfPnt) myPoints;
|
||||||
|
};
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// function : constructCurve
|
||||||
|
// purpose :
|
||||||
|
//=======================================================================
|
||||||
|
bool CurveCreator_Utils::constructCurve
|
||||||
|
(const TopoDS_Shape theShape,
|
||||||
|
CurveCreator_Curve *theCurve,
|
||||||
|
gp_Ax3 &theLocalCS)
|
||||||
|
{
|
||||||
|
if (theShape.IsNull()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect wires or vertices from shape.
|
||||||
|
TopTools_ListOfShape aWOrV;
|
||||||
|
TopAbs_ShapeEnum aType = theShape.ShapeType();
|
||||||
|
|
||||||
|
if (aType == TopAbs_WIRE || aType == TopAbs_VERTEX) {
|
||||||
|
aWOrV.Append(theShape);
|
||||||
|
} else if (aType == TopAbs_COMPOUND) {
|
||||||
|
TopoDS_Iterator aShIter(theShape);
|
||||||
|
|
||||||
|
for (; aShIter.More(); aShIter.Next()) {
|
||||||
|
const TopoDS_Shape &aSubShape = aShIter.Value();
|
||||||
|
|
||||||
|
aType = aSubShape.ShapeType();
|
||||||
|
|
||||||
|
if (aType == TopAbs_WIRE || aType == TopAbs_VERTEX) {
|
||||||
|
aWOrV.Append(aSubShape);
|
||||||
|
} else {
|
||||||
|
// Only subshapes of types wire or vertex are supported.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Only wire (vertex) or compound of wires (vertices) are supported.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Treat each wire or vertex. Get points, compute the working plane.
|
||||||
|
gp_Pln aPlane;
|
||||||
|
Standard_Integer aPlaneStatus = PLN_FREE;
|
||||||
|
TopTools_ListIteratorOfListOfShape anIter(aWOrV);
|
||||||
|
std::list<Section3D> aListSec;
|
||||||
|
|
||||||
|
for (; anIter.More(); anIter.Next()) {
|
||||||
|
Section3D aSec3D;
|
||||||
|
|
||||||
|
aSec3D.myPoints = CurveCreator_Utils::getPoints
|
||||||
|
(anIter.Value(), aSec3D.myIsClosed, aSec3D.myIsBSpline);
|
||||||
|
|
||||||
|
if (aSec3D.myPoints.IsNull()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
aListSec.push_back(aSec3D);
|
||||||
|
|
||||||
|
if (aPlaneStatus != PLN_FIXED) {
|
||||||
|
// Compute plane
|
||||||
|
CurveCreator_Utils::FindPlane(aSec3D.myPoints, aPlane, aPlaneStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if it is possible to change a computed coordinate system by
|
||||||
|
// XOY, XOZ or YOZ or parallel to them.
|
||||||
|
gp_Pnt aO(0., 0., 0.);
|
||||||
|
gp_Dir aNDir(0., 0., 1.);
|
||||||
|
gp_Dir aXDir(1., 0., 0.);
|
||||||
|
gp_Ax3 anAxis;
|
||||||
|
Standard_Real aTolAng = Precision::Confusion(); // Angular() is too small.
|
||||||
|
|
||||||
|
switch (aPlaneStatus) {
|
||||||
|
case PLN_ORIGIN:
|
||||||
|
{
|
||||||
|
// Change the location.
|
||||||
|
aO.SetZ(aPlane.Location().Z());
|
||||||
|
anAxis.SetLocation(aO);
|
||||||
|
aPlane.SetPosition(anAxis);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PLN_OX:
|
||||||
|
{
|
||||||
|
// Fixed origin + OX axis
|
||||||
|
const gp_Dir &aPlnX = aPlane.Position().XDirection();
|
||||||
|
|
||||||
|
if (Abs(aPlnX.Z()) <= aTolAng) {
|
||||||
|
// Make a coordinate system parallel to XOY.
|
||||||
|
aO.SetZ(aPlane.Location().Z());
|
||||||
|
anAxis.SetLocation(aO);
|
||||||
|
aPlane.SetPosition(anAxis);
|
||||||
|
} else if (Abs(aPlnX.Y()) <= aTolAng) {
|
||||||
|
// Make a coordinate system parallel to XOZ.
|
||||||
|
aO.SetY(aPlane.Location().Y());
|
||||||
|
aNDir.SetCoord(0., 1., 0.);
|
||||||
|
aXDir.SetCoord(0., 0., 1.);
|
||||||
|
anAxis = gp_Ax3(aO, aNDir, aXDir);
|
||||||
|
aPlane.SetPosition(anAxis);
|
||||||
|
} else if (Abs(aPlnX.X()) <= aTolAng) {
|
||||||
|
// Make a coordinate system parallel to YOZ.
|
||||||
|
aO.SetX(aPlane.Location().X());
|
||||||
|
aNDir.SetCoord(1., 0., 0.);
|
||||||
|
aXDir.SetCoord(0., 1., 0.);
|
||||||
|
anAxis = gp_Ax3(aO, aNDir, aXDir);
|
||||||
|
aPlane.SetPosition(anAxis);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PLN_FIXED:
|
||||||
|
{
|
||||||
|
const gp_Dir &aPlnN = aPlane.Position().Direction();
|
||||||
|
gp_Dir aYDir(0., 1., 0.);
|
||||||
|
|
||||||
|
if (aPlnN.IsParallel(aNDir, aTolAng)) {
|
||||||
|
// Make a coordinate system parallel to XOY.
|
||||||
|
aO.SetZ(aPlane.Location().Z());
|
||||||
|
anAxis.SetLocation(aO);
|
||||||
|
aPlane.SetPosition(anAxis);
|
||||||
|
} else if (aPlnN.IsParallel(aYDir, aTolAng)) {
|
||||||
|
// Make a coordinate system parallel to XOZ.
|
||||||
|
aO.SetY(aPlane.Location().Y());
|
||||||
|
aNDir.SetCoord(0., 1., 0.);
|
||||||
|
aXDir.SetCoord(0., 0., 1.);
|
||||||
|
anAxis = gp_Ax3(aO, aNDir, aXDir);
|
||||||
|
aPlane.SetPosition(anAxis);
|
||||||
|
} else if (aPlnN.IsParallel(aXDir, aTolAng)) {
|
||||||
|
// Make a coordinate system parallel to YOZ.
|
||||||
|
aO.SetX(aPlane.Location().X());
|
||||||
|
aNDir.SetCoord(1., 0., 0.);
|
||||||
|
aXDir.SetCoord(0., 1., 0.);
|
||||||
|
anAxis = gp_Ax3(aO, aNDir, aXDir);
|
||||||
|
aPlane.SetPosition(anAxis);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PLN_FREE:
|
||||||
|
default:
|
||||||
|
// Use XOY plane.
|
||||||
|
aPlane.SetPosition(anAxis);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute 2d points.
|
||||||
|
std::list<Section3D>::const_iterator aSecIt = aListSec.begin();
|
||||||
|
Standard_Real aTolConf2 =
|
||||||
|
Precision::Confusion()*Precision::Confusion();
|
||||||
|
Standard_Real aX;
|
||||||
|
Standard_Real aY;
|
||||||
|
|
||||||
|
for (; aSecIt != aListSec.end(); ++aSecIt) {
|
||||||
|
Standard_Integer i;
|
||||||
|
CurveCreator::Coordinates aCoords;
|
||||||
|
|
||||||
|
for (i = aSecIt->myPoints->Lower(); i <= aSecIt->myPoints->Upper(); ++i) {
|
||||||
|
const gp_Pnt &aPnt = aSecIt->myPoints->Value(i);
|
||||||
|
|
||||||
|
if (aPlane.SquareDistance(aPnt) > aTolConf2) {
|
||||||
|
// The point doesn't lie on the plane.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ElSLib::Parameters(aPlane, aPnt, aX, aY);
|
||||||
|
aCoords.push_back(aX);
|
||||||
|
aCoords.push_back(aY);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a new section to the curve.
|
||||||
|
const std::string aSecName =
|
||||||
|
CurveCreator_UtilsICurve::getUniqSectionName(theCurve);
|
||||||
|
const CurveCreator::SectionType aSecType = aSecIt->myIsBSpline ?
|
||||||
|
CurveCreator::Spline : CurveCreator::Polyline;
|
||||||
|
|
||||||
|
theCurve->addSectionInternal(aSecName, aSecType,
|
||||||
|
aSecIt->myIsClosed, aCoords);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the local coordinate system.
|
||||||
|
theLocalCS = aPlane.Position();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
class CompareSectionToPoint
|
class CompareSectionToPoint
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -535,3 +777,218 @@ bool CurveCreator_Utils::isEqualPoints( const gp_Pnt& thePoint, const gp_Pnt& th
|
|||||||
{
|
{
|
||||||
return theOtherPoint.IsEqual( thePoint, LOCAL_SELECTION_TOLERANCE );
|
return theOtherPoint.IsEqual( thePoint, LOCAL_SELECTION_TOLERANCE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// function : getPoints
|
||||||
|
// purpose :
|
||||||
|
//=======================================================================
|
||||||
|
Handle(TColgp_HArray1OfPnt) CurveCreator_Utils::getPoints
|
||||||
|
(const TopoDS_Shape &theShape,
|
||||||
|
bool &IsClosed,
|
||||||
|
bool &IsBSpline)
|
||||||
|
{
|
||||||
|
Handle(TColgp_HArray1OfPnt) aResult;
|
||||||
|
|
||||||
|
IsClosed = false;
|
||||||
|
IsBSpline = false;
|
||||||
|
|
||||||
|
if (theShape.IsNull()) {
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TopAbs_ShapeEnum aShType = theShape.ShapeType();
|
||||||
|
|
||||||
|
if (aShType == TopAbs_VERTEX) {
|
||||||
|
// There is a single point.
|
||||||
|
gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(theShape));
|
||||||
|
|
||||||
|
aResult = new TColgp_HArray1OfPnt(1, 1, aPnt);
|
||||||
|
|
||||||
|
return aResult;
|
||||||
|
} else if (aShType != TopAbs_WIRE) {
|
||||||
|
// The shape is neither a vertex nor a wire.
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Treat wire.
|
||||||
|
BRepTools_WireExplorer anExp(TopoDS::Wire(theShape));
|
||||||
|
|
||||||
|
if (!anExp.More()) {
|
||||||
|
// Empty wires are not allowed.
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Treat the first edge.
|
||||||
|
TopoDS_Edge anEdge = anExp.Current();
|
||||||
|
Handle(Geom_Curve) aCurve = GetCurve(anEdge);
|
||||||
|
|
||||||
|
if (aCurve.IsNull()) {
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the curve type.
|
||||||
|
Handle(Standard_Type) aType = aCurve->DynamicType();
|
||||||
|
|
||||||
|
if (aType == STANDARD_TYPE(Geom_BSplineCurve)) {
|
||||||
|
IsBSpline = true;
|
||||||
|
} else if (aType != STANDARD_TYPE(Geom_Line)) {
|
||||||
|
// The curve is neither a line or a BSpline. It is not valid.
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Go to the next edge.
|
||||||
|
TopoDS_Vertex aFirstVtx = anExp.CurrentVertex();
|
||||||
|
|
||||||
|
anExp.Next();
|
||||||
|
|
||||||
|
if (IsBSpline) {
|
||||||
|
// There should be a single BSpline curve in the wire.
|
||||||
|
if (anExp.More()) {
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct a section from poles of BSpline.
|
||||||
|
Handle(Geom_BSplineCurve) aBSplCurve =
|
||||||
|
Handle(Geom_BSplineCurve)::DownCast(aCurve);
|
||||||
|
|
||||||
|
// Check if the edge is valid. It should not be based on trimmed curve.
|
||||||
|
gp_Pnt aCP[2] = { aBSplCurve->StartPoint(), aBSplCurve->EndPoint() };
|
||||||
|
TopoDS_Vertex aV[2];
|
||||||
|
Standard_Integer i;
|
||||||
|
|
||||||
|
TopExp::Vertices(anEdge, aV[0], aV[1]);
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
gp_Pnt aPnt = BRep_Tool::Pnt(aV[i]);
|
||||||
|
Standard_Real aTol = BRep_Tool::Tolerance(aV[i]);
|
||||||
|
|
||||||
|
if (!aPnt.IsEqual(aCP[i], aTol)) {
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IsClosed = aV[0].IsSame(aV[1]) ? true : false;
|
||||||
|
|
||||||
|
const Standard_Integer aNbPoints = aBSplCurve->NbKnots();
|
||||||
|
TColStd_Array1OfReal aKnots(1, aNbPoints);
|
||||||
|
|
||||||
|
aBSplCurve->Knots(aKnots);
|
||||||
|
aResult = new TColgp_HArray1OfPnt(1, aBSplCurve->NbKnots());
|
||||||
|
|
||||||
|
for (i = aKnots.Lower(); i <= aKnots.Upper(); ++i) {
|
||||||
|
aResult->SetValue(i, aBSplCurve->Value(aKnots.Value(i)));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// This is a polyline.
|
||||||
|
TopTools_ListOfShape aVertices;
|
||||||
|
Standard_Integer aNbVtx = 1;
|
||||||
|
|
||||||
|
|
||||||
|
aVertices.Append(aFirstVtx);
|
||||||
|
|
||||||
|
for (; anExp.More(); anExp.Next(), ++aNbVtx) {
|
||||||
|
anEdge = anExp.Current();
|
||||||
|
aCurve = GetCurve(anEdge);
|
||||||
|
|
||||||
|
if (aCurve.IsNull()) {
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
aType = aCurve->DynamicType();
|
||||||
|
|
||||||
|
if (aType != STANDARD_TYPE(Geom_Line)) {
|
||||||
|
// The curve is not a line. It is not valid.
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the current vertex to the list.
|
||||||
|
aVertices.Append(anExp.CurrentVertex());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the section is closed.
|
||||||
|
TopoDS_Vertex aLastVtx = TopExp::LastVertex(anEdge, Standard_True);
|
||||||
|
|
||||||
|
IsClosed = aFirstVtx.IsSame(aLastVtx) ? true : false;
|
||||||
|
|
||||||
|
// Fill the array of points.
|
||||||
|
aResult = new TColgp_HArray1OfPnt(1, aNbVtx);
|
||||||
|
|
||||||
|
Standard_Integer i;
|
||||||
|
TopTools_ListIteratorOfListOfShape aVtxIter(aVertices);
|
||||||
|
|
||||||
|
for (i = 1; aVtxIter.More(); aVtxIter.Next(), ++i) {
|
||||||
|
gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aVtxIter.Value()));
|
||||||
|
|
||||||
|
aResult->SetValue(i, aPnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
//=======================================================================
|
||||||
|
// function : FindPlane
|
||||||
|
// purpose :
|
||||||
|
//=======================================================================
|
||||||
|
void CurveCreator_Utils::FindPlane
|
||||||
|
(const Handle_TColgp_HArray1OfPnt &thePoints,
|
||||||
|
gp_Pln &thePlane,
|
||||||
|
Standard_Integer &thePlnStatus)
|
||||||
|
{
|
||||||
|
if (thePoints.IsNull() || thePlnStatus == PLN_FIXED) {
|
||||||
|
// The plane can't be defined or is fixed. Nothing to change.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Standard_Integer i;
|
||||||
|
const Standard_Real aTolConf = Precision::Confusion();
|
||||||
|
|
||||||
|
for (i = thePoints->Lower(); i <= thePoints->Upper(); ++i) {
|
||||||
|
const gp_Pnt &aPnt = thePoints->Value(i);
|
||||||
|
|
||||||
|
switch (thePlnStatus) {
|
||||||
|
case PLN_FREE:
|
||||||
|
// Fix the origin.
|
||||||
|
thePlane.SetLocation(aPnt);
|
||||||
|
thePlnStatus = PLN_ORIGIN;
|
||||||
|
break;
|
||||||
|
case PLN_ORIGIN:
|
||||||
|
{
|
||||||
|
// Fix origin + OX axis
|
||||||
|
const gp_Pnt &aPlnLoc = thePlane.Location();
|
||||||
|
|
||||||
|
if (!aPnt.IsEqual(aPlnLoc, aTolConf)) {
|
||||||
|
// Set the X axis.
|
||||||
|
gp_Dir aXDir(aPnt.XYZ().Subtracted(aPlnLoc.XYZ()));
|
||||||
|
gp_Ax3 aXNorm(aPlnLoc, aXDir);
|
||||||
|
gp_Ax3 aNewPlnPos(aPlnLoc, aXNorm.XDirection(), aXNorm.Direction());
|
||||||
|
|
||||||
|
thePlane.SetPosition(aNewPlnPos);
|
||||||
|
thePlnStatus = PLN_OX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PLN_OX:
|
||||||
|
{
|
||||||
|
// Fix OY axis
|
||||||
|
gp_Lin aXLin(thePlane.XAxis());
|
||||||
|
Standard_Real aSqrDist = aXLin.SquareDistance(aPnt);
|
||||||
|
|
||||||
|
if (aSqrDist > aTolConf*aTolConf) {
|
||||||
|
// Compute main axis.
|
||||||
|
const gp_Pnt &aPlnLoc = thePlane.Location();
|
||||||
|
gp_Dir aDir(aPnt.XYZ().Subtracted(aPlnLoc.XYZ()));
|
||||||
|
gp_Ax3 aXNorm(aPlnLoc, aXLin.Direction(), aDir);
|
||||||
|
gp_Ax3 aNewPlnPos(aPlnLoc, aXNorm.YDirection(),
|
||||||
|
aXNorm.Direction());
|
||||||
|
|
||||||
|
thePlane.SetPosition(aNewPlnPos);
|
||||||
|
thePlnStatus = PLN_FIXED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -29,10 +29,13 @@
|
|||||||
#include <gp_Pnt.hxx>
|
#include <gp_Pnt.hxx>
|
||||||
#include <Geom_Curve.hxx>
|
#include <Geom_Curve.hxx>
|
||||||
#include <TopoDS_Shape.hxx>
|
#include <TopoDS_Shape.hxx>
|
||||||
|
#include <TColgp_HArray1OfPnt.hxx>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <vector> // TODO: remove
|
#include <vector> // TODO: remove
|
||||||
|
|
||||||
|
class CurveCreator_Curve;
|
||||||
|
|
||||||
|
|
||||||
class CurveCreator_Utils
|
class CurveCreator_Utils
|
||||||
{
|
{
|
||||||
@ -69,6 +72,19 @@ public:
|
|||||||
CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve,
|
CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve,
|
||||||
TopoDS_Shape& theShape );
|
TopoDS_Shape& theShape );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a curve from a shape.
|
||||||
|
* \param theShape a shape to be converted to curve.
|
||||||
|
* \param theCurve a curve object to be initialized.
|
||||||
|
* \param theLocalCS the local coordinate system of the curve.
|
||||||
|
* \return true in case of success; false otherwise. Warning: the curve can
|
||||||
|
* be modified even if the shape is not valid for curve construction.
|
||||||
|
*/
|
||||||
|
CURVECREATOR_EXPORT static bool constructCurve
|
||||||
|
(const TopoDS_Shape theShape,
|
||||||
|
CurveCreator_Curve *theCurve,
|
||||||
|
gp_Ax3 &theLocalCS);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find selected points in the context
|
* Find selected points in the context
|
||||||
* \param theContext the viewer context
|
* \param theContext the viewer context
|
||||||
@ -124,12 +140,12 @@ protected:
|
|||||||
* \param theCurve a geometry curve
|
* \param theCurve a geometry curve
|
||||||
* \param theOutPoint a found projected point on the curve
|
* \param theOutPoint a found projected point on the curve
|
||||||
*/
|
*/
|
||||||
CURVECREATOR_EXPORT static bool hasProjectPointOnCurve(
|
static bool hasProjectPointOnCurve(
|
||||||
Handle(V3d_View) theView,
|
Handle(V3d_View) theView,
|
||||||
const int theX, const int theY,
|
const int theX, const int theY,
|
||||||
const Handle(Geom_Curve)& theCurve,
|
const Handle(Geom_Curve)& theCurve,
|
||||||
Standard_Real& theParameter,
|
Standard_Real& theParameter,
|
||||||
int& theDelta );
|
int& theDelta );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns whether the X and Y coordinates is in the pixel tolerance
|
* Returns whether the X and Y coordinates is in the pixel tolerance
|
||||||
@ -141,9 +157,9 @@ protected:
|
|||||||
* \param theDelta the sum of the a square of X and a square of Y
|
* \param theDelta the sum of the a square of X and a square of Y
|
||||||
* \returns whether the points are provide to the pixel tolerance
|
* \returns whether the points are provide to the pixel tolerance
|
||||||
*/
|
*/
|
||||||
CURVECREATOR_EXPORT static bool isEqualPixels( const int theX, const int theY,
|
static bool isEqualPixels( const int theX, const int theY,
|
||||||
const int theOtherX, const int theOtherY,
|
const int theOtherX, const int theOtherY,
|
||||||
const double theTolerance, int& theDelta );
|
const double theTolerance, int& theDelta );
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -152,8 +168,44 @@ protected:
|
|||||||
* \param theOtherPoint the second point
|
* \param theOtherPoint the second point
|
||||||
* \returns whether the points are provide to the pixel tolerance
|
* \returns whether the points are provide to the pixel tolerance
|
||||||
*/
|
*/
|
||||||
CURVECREATOR_EXPORT static bool isEqualPoints( const gp_Pnt& thePoint,
|
static bool isEqualPoints( const gp_Pnt& thePoint,
|
||||||
const gp_Pnt& theOtherPoint );
|
const gp_Pnt& theOtherPoint );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the array of points of a shape to construct a curve section. The
|
||||||
|
* shape can be either a wire or a vertex. For vertex a single point in the
|
||||||
|
* array is returned.
|
||||||
|
*
|
||||||
|
* \param theShape the shape. Can be either a wire or a vertex.
|
||||||
|
* \param IsClosed closed flag. Output parameter.
|
||||||
|
* \param IsBSpline BSpline flag. Output parameter.
|
||||||
|
* \return the array of points. Null handle in case of failure.
|
||||||
|
*/
|
||||||
|
static Handle_TColgp_HArray1OfPnt getPoints
|
||||||
|
(const TopoDS_Shape &theShape,
|
||||||
|
bool &IsClosed,
|
||||||
|
bool &IsBSpline);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method computes a plane using the input points. The plane is defined
|
||||||
|
* by gp_Pln object and the status. The status can have one of the following
|
||||||
|
* values:
|
||||||
|
* - 0 plane is not set.<BR>
|
||||||
|
* - 1 origin of the plane is fixed. The plane is defined by 1 or several
|
||||||
|
* coincident points.<BR>
|
||||||
|
* - 2 origin + OX axis of the plane is fixed. The plane is defined by 2
|
||||||
|
* or more points that lie on a particular line.<BR>
|
||||||
|
* - 3 plane is fixed. Plane is defined by 3 not coincident points.<BR>
|
||||||
|
*
|
||||||
|
* \param thePoints the points.
|
||||||
|
* \param thePlane the current plane on input. It can be modified on output.
|
||||||
|
* \param thePlnStatus the current status on input. It can be modified on
|
||||||
|
* output.
|
||||||
|
*/
|
||||||
|
static void FindPlane(const Handle_TColgp_HArray1OfPnt &thePoints,
|
||||||
|
gp_Pln &thePlane,
|
||||||
|
Standard_Integer &thePlnStatus);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CURVECREATOR_UTILS_H
|
#endif // CURVECREATOR_UTILS_H
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include <SUIT_ResourceMgr.h>
|
#include <SUIT_ResourceMgr.h>
|
||||||
#include <SUIT_ViewManager.h>
|
#include <SUIT_ViewManager.h>
|
||||||
|
|
||||||
#include <OCCViewer_ViewWindow.h>
|
|
||||||
#include <OCCViewer_ViewManager.h>
|
#include <OCCViewer_ViewManager.h>
|
||||||
#include <OCCViewer_ViewPort3d.h>
|
#include <OCCViewer_ViewPort3d.h>
|
||||||
#include <OCCViewer_Utilities.h>
|
#include <OCCViewer_Utilities.h>
|
||||||
@ -84,7 +83,8 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
|
|||||||
int theLocalPointRowLimit )
|
int theLocalPointRowLimit )
|
||||||
: QWidget(parent), myNewSectionEditor(NULL), myCurve(theCurve), mySection(0),
|
: QWidget(parent), myNewSectionEditor(NULL), myCurve(theCurve), mySection(0),
|
||||||
myDragStarted( false ), myDragInteractionStyle( SUIT_ViewModel::STANDARD ),
|
myDragStarted( false ), myDragInteractionStyle( SUIT_ViewModel::STANDARD ),
|
||||||
myOCCViewer( 0 ), myLocalPointRowLimit( theLocalPointRowLimit )
|
myOCCViewer( 0 ), myLocalPointRowLimit( theLocalPointRowLimit ),
|
||||||
|
myOld2DMode(OCCViewer_ViewWindow::No2dMode)
|
||||||
{
|
{
|
||||||
bool isToEnableClosed = !( theActionFlags & DisableClosedSection );
|
bool isToEnableClosed = !( theActionFlags & DisableClosedSection );
|
||||||
myNewSectionEditor = new CurveCreator_NewSectionDlg( this, isToEnableClosed );
|
myNewSectionEditor = new CurveCreator_NewSectionDlg( this, isToEnableClosed );
|
||||||
@ -240,7 +240,7 @@ void CurveCreator_Widget::setOCCViewer( OCCViewer_Viewer* theViewer )
|
|||||||
disconnect( aViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
|
disconnect( aViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
|
||||||
this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
|
this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
|
||||||
// restore normal mode in the viewer
|
// restore normal mode in the viewer
|
||||||
OCCViewer_Utilities::setViewer2DMode( myOCCViewer, OCCViewer_ViewWindow::No2dMode );
|
SetViewer2DMode(false);
|
||||||
// all local contexts should be closed if the viewer is not more used
|
// all local contexts should be closed if the viewer is not more used
|
||||||
setLocalPointContext( false, true );
|
setLocalPointContext( false, true );
|
||||||
}
|
}
|
||||||
@ -257,7 +257,7 @@ void CurveCreator_Widget::setOCCViewer( OCCViewer_Viewer* theViewer )
|
|||||||
this, SLOT( onMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
|
this, SLOT( onMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
|
||||||
connect( aViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
|
connect( aViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
|
||||||
this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
|
this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
|
||||||
OCCViewer_Utilities::setViewer2DMode( myOCCViewer, OCCViewer_ViewWindow::XYPlane );
|
SetViewer2DMode(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -946,6 +946,18 @@ CurveCreator_Widget::ActionMode CurveCreator_Widget::getActionMode() const
|
|||||||
return aMode;
|
return aMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CurveCreator_Widget::SetViewer2DMode(const bool To2D)
|
||||||
|
{
|
||||||
|
if (myOCCViewer) {
|
||||||
|
if (To2D) {
|
||||||
|
myOld2DMode = OCCViewer_Utilities::setViewer2DMode
|
||||||
|
(myOCCViewer, OCCViewer_ViewWindow::XYPlane);
|
||||||
|
} else {
|
||||||
|
OCCViewer_Utilities::setViewer2DMode(myOCCViewer, myOld2DMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
// function : GeometryGUI::addCoordsByClick()
|
// function : GeometryGUI::addCoordsByClick()
|
||||||
// purpose : Manage mouse press events in Additon mode
|
// purpose : Manage mouse press events in Additon mode
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
|
||||||
|
#include <OCCViewer_ViewWindow.h>
|
||||||
#include <SUIT_ViewWindow.h>
|
#include <SUIT_ViewWindow.h>
|
||||||
#include <AIS_InteractiveObject.hxx>
|
#include <AIS_InteractiveObject.hxx>
|
||||||
#include <AIS_InteractiveContext.hxx>
|
#include <AIS_InteractiveContext.hxx>
|
||||||
@ -93,6 +94,8 @@ public:
|
|||||||
void setActionMode( const ActionMode& theMode );
|
void setActionMode( const ActionMode& theMode );
|
||||||
ActionMode getActionMode() const;
|
ActionMode getActionMode() const;
|
||||||
|
|
||||||
|
void SetViewer2DMode(const bool To2D);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void selectionChanged();
|
void selectionChanged();
|
||||||
void subOperationStarted( QWidget*, bool );
|
void subOperationStarted( QWidget*, bool );
|
||||||
@ -222,6 +225,7 @@ private:
|
|||||||
QByteArray myGuiState;
|
QByteArray myGuiState;
|
||||||
int myPressedX;
|
int myPressedX;
|
||||||
int myPressedY;
|
int myPressedY;
|
||||||
|
OCCViewer_ViewWindow::Mode2dType myOld2DMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CURVECREATOR_WIDGET_H
|
#endif // CURVECREATOR_WIDGET_H
|
||||||
|
@ -22,18 +22,27 @@
|
|||||||
|
|
||||||
#include "EntityGUI_PolylineDlg.h"
|
#include "EntityGUI_PolylineDlg.h"
|
||||||
#include <CurveCreator_Curve.hxx>
|
#include <CurveCreator_Curve.hxx>
|
||||||
|
#include <CurveCreator_Utils.hxx>
|
||||||
#include <CurveCreator_Widget.h>
|
#include <CurveCreator_Widget.h>
|
||||||
#include <DlgRef.h>
|
#include <DlgRef.h>
|
||||||
#include <GeometryGUI.h>
|
#include <GeometryGUI.h>
|
||||||
|
#include <GEOMBase.h>
|
||||||
|
|
||||||
#include <OCCViewer_ViewManager.h>
|
#include <OCCViewer_ViewManager.h>
|
||||||
|
#include <LightApp_SelectionMgr.h>
|
||||||
#include <SalomeApp_Application.h>
|
#include <SalomeApp_Application.h>
|
||||||
#include <SUIT_ResourceMgr.h>
|
#include <SUIT_ResourceMgr.h>
|
||||||
#include <SUIT_Session.h>
|
#include <SUIT_Session.h>
|
||||||
|
|
||||||
|
#include <BRep_Tool.hxx>
|
||||||
|
#include <Geom_Surface.hxx>
|
||||||
|
#include <GeomLib_IsPlanarSurface.hxx>
|
||||||
|
#include <TopoDS.hxx>
|
||||||
|
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
//#define SET_PLANE
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
// function : Constructor
|
// function : Constructor
|
||||||
@ -41,9 +50,20 @@
|
|||||||
//=================================================================================
|
//=================================================================================
|
||||||
EntityGUI_PolylineDlg::EntityGUI_PolylineDlg
|
EntityGUI_PolylineDlg::EntityGUI_PolylineDlg
|
||||||
(GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl)
|
(GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl)
|
||||||
: GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl )
|
: GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl ),
|
||||||
|
myCurve (0),
|
||||||
|
myEditorWidget (0),
|
||||||
|
myAddElementBox (0),
|
||||||
|
myPlnComboBox (0),
|
||||||
|
myPlnButton (0),
|
||||||
|
myPlnSelButton (0),
|
||||||
|
myWPlaneLineEdit (0),
|
||||||
|
myPolylineSelButton (0),
|
||||||
|
myPolylineEdit (0),
|
||||||
|
myEditCurrentArgument (0)
|
||||||
{
|
{
|
||||||
QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_CC_POLYLINE" ) ) );
|
QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_POLYLINE")));
|
||||||
|
QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
|
||||||
|
|
||||||
setWindowTitle(tr("POLYLINE_DLG_TITLE"));
|
setWindowTitle(tr("POLYLINE_DLG_TITLE"));
|
||||||
|
|
||||||
@ -55,6 +75,46 @@ EntityGUI_PolylineDlg::EntityGUI_PolylineDlg
|
|||||||
mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
|
mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
|
||||||
mainFrame()->RadioButton3->close();
|
mainFrame()->RadioButton3->close();
|
||||||
|
|
||||||
|
QGroupBox *aGroupBox1 = new QGroupBox(tr("GEOM_CS"), this);
|
||||||
|
QGridLayout *aPlaneLayout = new QGridLayout(aGroupBox1);
|
||||||
|
|
||||||
|
aPlaneLayout->setSpacing(6);
|
||||||
|
aPlaneLayout->setMargin(11);
|
||||||
|
|
||||||
|
myPlnComboBox = new QComboBox(aGroupBox1);
|
||||||
|
aPlaneLayout->addWidget(myPlnComboBox, 0, 0, 1, 3);
|
||||||
|
|
||||||
|
myPlnButton = new QPushButton (aGroupBox1);
|
||||||
|
myPlnButton->setText( tr( "GEOM_SKETCHER_RESTORE" ) );
|
||||||
|
aPlaneLayout->addWidget(myPlnButton, 0, 3);
|
||||||
|
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
QLabel *aPlaneLbl = new QLabel(tr("GEOM_PLANE"), aGroupBox1);
|
||||||
|
|
||||||
|
myPlnSelButton = new QPushButton (aGroupBox1);
|
||||||
|
myPlnSelButton->setIcon(image1);
|
||||||
|
myWPlaneLineEdit = new QLineEdit (aGroupBox1);
|
||||||
|
myWPlaneLineEdit->setReadOnly(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QLabel *aPolylineLbl = new QLabel(tr("POLYLINE_IMPORT"), aGroupBox1);
|
||||||
|
|
||||||
|
myPolylineSelButton = new QPushButton (aGroupBox1);
|
||||||
|
myPolylineSelButton->setIcon(image1);
|
||||||
|
myPolylineEdit = new QLineEdit (aGroupBox1);
|
||||||
|
myPolylineEdit->setReadOnly(true);
|
||||||
|
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
aPlaneLayout->addWidget(aPlaneLbl, 1, 0);
|
||||||
|
aPlaneLayout->addWidget(myPlnSelButton, 1, 1);
|
||||||
|
aPlaneLayout->addWidget(myWPlaneLineEdit, 1, 2, 1, 2);
|
||||||
|
#endif
|
||||||
|
aPlaneLayout->addWidget(aPolylineLbl, 2, 0);
|
||||||
|
aPlaneLayout->addWidget(myPolylineSelButton, 2, 1);
|
||||||
|
aPlaneLayout->addWidget(myPolylineEdit, 2, 2, 1, 2);
|
||||||
|
|
||||||
|
aPlaneLayout->setColumnStretch(2, 1);
|
||||||
|
|
||||||
myCurve = new CurveCreator_Curve( CurveCreator::Dim2d );
|
myCurve = new CurveCreator_Curve( CurveCreator::Dim2d );
|
||||||
myEditorWidget = new CurveCreator_Widget (centralWidget(), myCurve);
|
myEditorWidget = new CurveCreator_Widget (centralWidget(), myCurve);
|
||||||
myAddElementBox = new QGroupBox (tr("POLYLINE_ADD_SECTION"), centralWidget());
|
myAddElementBox = new QGroupBox (tr("POLYLINE_ADD_SECTION"), centralWidget());
|
||||||
@ -68,6 +128,7 @@ EntityGUI_PolylineDlg::EntityGUI_PolylineDlg
|
|||||||
|
|
||||||
layout->setMargin( 0 );
|
layout->setMargin( 0 );
|
||||||
layout->setSpacing( 6 );
|
layout->setSpacing( 6 );
|
||||||
|
layout->addWidget( aGroupBox1 );
|
||||||
layout->addWidget( myEditorWidget );
|
layout->addWidget( myEditorWidget );
|
||||||
layout->addWidget( myAddElementBox );
|
layout->addWidget( myAddElementBox );
|
||||||
|
|
||||||
@ -99,20 +160,49 @@ void EntityGUI_PolylineDlg::Init()
|
|||||||
SalomeApp_Application *anApp = myGeomGUI->getApp();
|
SalomeApp_Application *anApp = myGeomGUI->getApp();
|
||||||
OCCViewer_ViewManager *aViewManager = dynamic_cast<OCCViewer_ViewManager*>
|
OCCViewer_ViewManager *aViewManager = dynamic_cast<OCCViewer_ViewManager*>
|
||||||
(anApp->getViewManager(OCCViewer_Viewer::Type(), true));
|
(anApp->getViewManager(OCCViewer_Viewer::Type(), true));
|
||||||
|
LightApp_SelectionMgr *aSelMgr = myGeomGUI->getApp()->selectionMgr();
|
||||||
|
|
||||||
myEditorWidget->setOCCViewer( aViewManager ? aViewManager->getOCCViewer() : 0 );
|
myEditorWidget->setOCCViewer(aViewManager ? aViewManager->getOCCViewer() : 0);
|
||||||
|
|
||||||
|
// Init the list of local coordinate system
|
||||||
|
gp_Pnt aPnt(0., 0., 0.);
|
||||||
|
gp_Dir aDirN(0., 0., 1.);
|
||||||
|
gp_Dir aDirX(1., 0., 0.);
|
||||||
|
gp_Ax3 aLCS(aPnt, aDirN, aDirX);
|
||||||
|
|
||||||
|
//add Global CS
|
||||||
|
myPlnComboBox->addItem(tr("GEOM_GCS"), false);
|
||||||
|
myWPlaneList.push_back(GEOM::GeomObjPtr());
|
||||||
|
myLCSList.push_back(aLCS);
|
||||||
|
|
||||||
|
connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
|
||||||
|
connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
|
||||||
|
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
connect(myPlnSelButton, SIGNAL(clicked()),
|
||||||
|
this, SLOT(SetEditCurrentArgument()));
|
||||||
|
#endif
|
||||||
|
connect(myPolylineSelButton, SIGNAL(clicked()),
|
||||||
|
this, SLOT(SetEditCurrentArgument()));
|
||||||
|
connect(aSelMgr, SIGNAL(currentSelectionChanged()),
|
||||||
|
this, SLOT(SelectionIntoArgument()));
|
||||||
connect(myEditorWidget, SIGNAL(subOperationStarted(QWidget*, bool)),
|
connect(myEditorWidget, SIGNAL(subOperationStarted(QWidget*, bool)),
|
||||||
this, SLOT(processStartedSubOperation(QWidget*, bool)));
|
this, SLOT(processStartedSubOperation(QWidget*, bool)));
|
||||||
connect(myEditorWidget, SIGNAL(subOperationFinished(QWidget*)),
|
connect(myEditorWidget, SIGNAL(subOperationFinished(QWidget*)),
|
||||||
this, SLOT(processFinishedSubOperation(QWidget*)));
|
this, SLOT(processFinishedSubOperation(QWidget*)));
|
||||||
connect(myEditorWidget, SIGNAL(curveModified()),
|
connect(myEditorWidget, SIGNAL(curveModified()),
|
||||||
this, SLOT(onUpdatePreview()));
|
this, SLOT(onUpdatePreview()));
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
connect(myPlnComboBox, SIGNAL(activated(int)),
|
||||||
|
this, SLOT(ActivateLocalCS()));
|
||||||
|
connect(myPlnButton, SIGNAL(clicked()),
|
||||||
|
this, SLOT(ActivateLocalCS()));
|
||||||
|
#endif
|
||||||
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
|
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
|
||||||
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
|
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
|
||||||
|
|
||||||
myAddElementBox->hide();
|
myAddElementBox->hide();
|
||||||
|
myPolylineSelButton->click();
|
||||||
SelectionIntoArgument();
|
SelectionIntoArgument();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,7 +219,7 @@ void EntityGUI_PolylineDlg::Clear()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
// function : createOperation
|
// function : GetCurveParams
|
||||||
// purpose :
|
// purpose :
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
void EntityGUI_PolylineDlg::GetCurveParams(GEOM::ListOfListOfDouble &theCoords,
|
void EntityGUI_PolylineDlg::GetCurveParams(GEOM::ListOfListOfDouble &theCoords,
|
||||||
@ -211,18 +301,39 @@ bool EntityGUI_PolylineDlg::execute( ObjectList& objects )
|
|||||||
|
|
||||||
GetCurveParams(aCoords, aNames, aTypes, aCloseds);
|
GetCurveParams(aCoords, aNames, aTypes, aCloseds);
|
||||||
|
|
||||||
// Temporary code: get Working Plane.
|
// Get Working Plane.
|
||||||
GEOM::GEOM_IBasicOperations_var aBasicOp = getGeomEngine()->GetIBasicOperations( getStudyId() );
|
int ind = myPlnComboBox->currentIndex();
|
||||||
GEOM::GEOM_Object_var aWPlane = aBasicOp->MakeMarker( 0,0,0,
|
|
||||||
1,0,0,
|
|
||||||
0,1,0 );
|
|
||||||
|
|
||||||
// Perform operation
|
if (ind != -1) {
|
||||||
GEOM::GEOM_Object_var anObj = anOper->MakePolyline2DOnPlane
|
bool isPlane = myPlnComboBox->itemData(ind).toBool();
|
||||||
(aCoords, aNames, aTypes, aCloseds, aWPlane);
|
GEOM::GEOM_Object_var anObj;
|
||||||
|
|
||||||
if (!anObj->_is_nil()) {
|
// Perform operation
|
||||||
objects.push_back(anObj._retn());
|
if (isPlane) {
|
||||||
|
anObj = anOper->MakePolyline2DOnPlane
|
||||||
|
(aCoords, aNames, aTypes, aCloseds, myWPlaneList.at(ind).get());
|
||||||
|
} else {
|
||||||
|
gp_Ax3 anAxis = myLCSList.at(ind);
|
||||||
|
GEOM::ListOfDouble aPlane;
|
||||||
|
|
||||||
|
aPlane.length(9);
|
||||||
|
aPlane[0] = anAxis.Location().X();
|
||||||
|
aPlane[1] = anAxis.Location().Y();
|
||||||
|
aPlane[2] = anAxis.Location().Z();
|
||||||
|
aPlane[3] = anAxis.Direction().X();
|
||||||
|
aPlane[4] = anAxis.Direction().Y();
|
||||||
|
aPlane[5] = anAxis.Direction().Z();
|
||||||
|
aPlane[6] = anAxis.XDirection().X();
|
||||||
|
aPlane[7] = anAxis.XDirection().Y();
|
||||||
|
aPlane[8] = anAxis.XDirection().Z();
|
||||||
|
|
||||||
|
anObj = anOper->MakePolyline2D
|
||||||
|
(aCoords, aNames, aTypes, aCloseds, aPlane);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!anObj->_is_nil()) {
|
||||||
|
objects.push_back(anObj._retn());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -254,6 +365,16 @@ bool EntityGUI_PolylineDlg::ClickOnApply()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ClickOnCancel()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void EntityGUI_PolylineDlg::ClickOnCancel()
|
||||||
|
{
|
||||||
|
myEditorWidget->SetViewer2DMode(false);
|
||||||
|
GEOMBase_Skeleton::ClickOnCancel();
|
||||||
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
// function : processStartedSubOperation
|
// function : processStartedSubOperation
|
||||||
// purpose :
|
// purpose :
|
||||||
@ -287,7 +408,7 @@ void EntityGUI_PolylineDlg::processFinishedSubOperation( QWidget* theWidget )
|
|||||||
}
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
// function : execute
|
// function : deleteSelected
|
||||||
// purpose : Redirect the delete action to editor widget
|
// purpose : Redirect the delete action to editor widget
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
void EntityGUI_PolylineDlg::deleteSelected()
|
void EntityGUI_PolylineDlg::deleteSelected()
|
||||||
@ -310,27 +431,93 @@ bool EntityGUI_PolylineDlg::deleteEnabled()
|
|||||||
//=================================================================================
|
//=================================================================================
|
||||||
void EntityGUI_PolylineDlg::SelectionIntoArgument()
|
void EntityGUI_PolylineDlg::SelectionIntoArgument()
|
||||||
{
|
{
|
||||||
/*
|
bool isModified = false;
|
||||||
GEOM::GeomObjPtr aSelectedObject = getSelected( TopAbs_SHAPE );
|
GEOM::GeomObjPtr aSelectedObject = getSelected(TopAbs_SHAPE);
|
||||||
TopoDS_Shape aShape;
|
TopoDS_Shape aShape;
|
||||||
|
|
||||||
if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ) {
|
if (aSelectedObject && GEOMBase::GetShape(aSelectedObject.get(), aShape) &&
|
||||||
if (aShape.ShapeType() == TopAbs_FACE) {
|
!aShape.IsNull()) {
|
||||||
QString aName = GEOMBase::GetName( aSelectedObject.get() );
|
QString aName = GEOMBase::GetName(aSelectedObject.get());
|
||||||
myGroup->LineEdit1->setText( aName );
|
|
||||||
|
|
||||||
// clear selection
|
if (myEditCurrentArgument == myPolylineEdit) {
|
||||||
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
|
// Import a curve
|
||||||
myGeomGUI->getApp()->selectionMgr()->clearSelected();
|
CurveCreator_Curve *aNewCurve =
|
||||||
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
|
new CurveCreator_Curve(CurveCreator::Dim2d);
|
||||||
this, SLOT(SelectionIntoArgument()));
|
gp_Ax3 aLocalCS;
|
||||||
|
|
||||||
myFace = aSelectedObject;
|
if (CurveCreator_Utils::constructCurve(aShape, aNewCurve, aLocalCS)) {
|
||||||
|
// Change the current curve be the new one.
|
||||||
|
myEditorWidget->setCurve(aNewCurve);
|
||||||
|
delete myCurve;
|
||||||
|
myCurve = aNewCurve;
|
||||||
|
isModified = true;
|
||||||
|
myPolylineEdit->setText(aName);
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
AddLocalCS(aSelectedObject.get(), false, aLocalCS);
|
||||||
|
myWPlaneLineEdit->clear();
|
||||||
|
myPlnSelButton->setDown(false);
|
||||||
|
#endif
|
||||||
|
myPolylineSelButton->setDown(true);
|
||||||
|
} else {
|
||||||
|
// Does nothing, just clears selection.
|
||||||
|
delete aNewCurve;
|
||||||
|
}
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
} else if (myEditCurrentArgument == myWPlaneLineEdit) {
|
||||||
|
// Import planar face.
|
||||||
|
if (aShape.ShapeType() == TopAbs_FACE) {
|
||||||
|
// Check if the face is planar
|
||||||
|
Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(aShape));
|
||||||
|
GeomLib_IsPlanarSurface aPlanarCheck(aSurf, Precision::Confusion());
|
||||||
|
|
||||||
|
if (aPlanarCheck.IsPlanar()) {
|
||||||
|
myWPlaneLineEdit->setText(aName);
|
||||||
|
myPolylineEdit->clear();
|
||||||
|
AddLocalCS(aSelectedObject.get(), true,
|
||||||
|
WPlaneToLCS(aSelectedObject.get()));
|
||||||
|
isModified = true;
|
||||||
|
myPlnSelButton->setDown(true);
|
||||||
|
myPolylineSelButton->setDown(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isModified) {
|
||||||
|
myEditCurrentArgument->setText(tr("GEOM_SKETCHER_WPLANE"));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
displayPreview(true);
|
if (!isModified) {
|
||||||
*/
|
// Does nothing, just clears selection.
|
||||||
|
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
|
||||||
|
myGeomGUI->getApp()->selectionMgr()->clearSelected();
|
||||||
|
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
|
||||||
|
this, SLOT(SelectionIntoArgument()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : SetEditCurrentArgument()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void EntityGUI_PolylineDlg::SetEditCurrentArgument()
|
||||||
|
{
|
||||||
|
if (sender() == myPlnSelButton) {
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
myEditCurrentArgument = myWPlaneLineEdit;
|
||||||
|
myEditCurrentArgument->setFocus();
|
||||||
|
myPlnSelButton->setDown(true);
|
||||||
|
myPolylineSelButton->setDown(false);
|
||||||
|
#endif
|
||||||
|
} else if (sender() == myPolylineSelButton) {
|
||||||
|
myEditCurrentArgument = myPolylineEdit;
|
||||||
|
myEditCurrentArgument->setFocus();
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
myPlnSelButton->setDown(false);
|
||||||
|
#endif
|
||||||
|
myPolylineSelButton->setDown(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
@ -341,7 +528,8 @@ void EntityGUI_PolylineDlg::ActivateThisDialog()
|
|||||||
{
|
{
|
||||||
GEOMBase_Skeleton::ActivateThisDialog();
|
GEOMBase_Skeleton::ActivateThisDialog();
|
||||||
|
|
||||||
SelectionIntoArgument();
|
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
|
||||||
|
this, SLOT(SelectionIntoArgument()));
|
||||||
}
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
@ -362,3 +550,121 @@ void EntityGUI_PolylineDlg::onUpdatePreview()
|
|||||||
{
|
{
|
||||||
displayPreview(true);
|
displayPreview(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ActivateLocalCS
|
||||||
|
// purpose : Activate & Fit Working plane
|
||||||
|
//=================================================================================
|
||||||
|
void EntityGUI_PolylineDlg::ActivateLocalCS()
|
||||||
|
{
|
||||||
|
const int ind = myPlnComboBox->currentIndex();
|
||||||
|
|
||||||
|
if (ind == 0) {
|
||||||
|
// Default plane
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
myWPlaneLineEdit->clear();
|
||||||
|
#endif
|
||||||
|
myPolylineEdit->clear();
|
||||||
|
} else if (ind > 0) { // Skip 0 as it is default
|
||||||
|
// Update text on line edits.
|
||||||
|
QString aName = GEOMBase::GetName(GetActiveWPlane().get());
|
||||||
|
bool isPlane = myPlnComboBox->itemData(ind).toBool();
|
||||||
|
|
||||||
|
if (isPlane) {
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
myWPlaneLineEdit->setText(aName);
|
||||||
|
#endif
|
||||||
|
myPolylineEdit->clear();
|
||||||
|
} else {
|
||||||
|
myPolylineEdit->setText(aName);
|
||||||
|
#ifdef SET_PLANE
|
||||||
|
myWPlaneLineEdit->clear();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gp_Ax3 anAxis = GetActiveLocalCS();
|
||||||
|
|
||||||
|
myGeomGUI->SetWorkingPlane(anAxis);
|
||||||
|
myGeomGUI->ActiveWorkingPlane();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : GetActiveLocalCS
|
||||||
|
// purpose : Get Working plane
|
||||||
|
//=================================================================================
|
||||||
|
gp_Ax3 EntityGUI_PolylineDlg::GetActiveLocalCS()
|
||||||
|
{
|
||||||
|
const int ind = myPlnComboBox->currentIndex();
|
||||||
|
|
||||||
|
return ind >= 0 ? myLCSList.at(ind) : myGeomGUI->GetWorkingPlane();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : GetActiveWPlane
|
||||||
|
// purpose : Get Working plane
|
||||||
|
//=================================================================================
|
||||||
|
GEOM::GeomObjPtr EntityGUI_PolylineDlg::GetActiveWPlane()
|
||||||
|
{
|
||||||
|
const int ind = myPlnComboBox->currentIndex();
|
||||||
|
|
||||||
|
return ind >= 0 ? myWPlaneList.at(ind) : GEOM::GeomObjPtr();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : AddLocalCS()
|
||||||
|
// purpose : Add All Coordinates systems in study
|
||||||
|
//=================================================================================
|
||||||
|
void EntityGUI_PolylineDlg::AddLocalCS(GEOM::GeomObjPtr theSelectedObject,
|
||||||
|
const bool IsPlane,
|
||||||
|
const gp_Ax3 &theLCS)
|
||||||
|
{
|
||||||
|
QString aName = GEOMBase::GetName(theSelectedObject.get());
|
||||||
|
|
||||||
|
int index = myPlnComboBox->findText(aName, Qt::MatchExactly);
|
||||||
|
|
||||||
|
if (index == -1) { // If the working plane hasn't been added yet
|
||||||
|
myWPlaneList.push_back(theSelectedObject);
|
||||||
|
myLCSList.push_back(theLCS);
|
||||||
|
myPlnComboBox->addItem(aName, QVariant(IsPlane));
|
||||||
|
index = myPlnComboBox->count();
|
||||||
|
myPlnComboBox->setCurrentIndex(index - 1);
|
||||||
|
} else {
|
||||||
|
myPlnComboBox->setCurrentIndex(index);
|
||||||
|
}
|
||||||
|
ActivateLocalCS();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : WPlaneToLCS ( aWPlane )
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
gp_Ax3 EntityGUI_PolylineDlg::WPlaneToLCS(GEOM::GeomObjPtr theGeomObj)
|
||||||
|
{
|
||||||
|
TopoDS_Shape aShape =
|
||||||
|
GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), theGeomObj.get());
|
||||||
|
gp_Ax3 aLCS;
|
||||||
|
|
||||||
|
if (theGeomObj || aShape.IsNull()) {
|
||||||
|
MESSAGE("CORBA::is_nil(theGeomObj) || aShape.IsNull()")
|
||||||
|
}
|
||||||
|
|
||||||
|
aLCS.Transform(aShape.Location().Transformation());
|
||||||
|
|
||||||
|
if (aShape.ShapeType() == TopAbs_FACE) {
|
||||||
|
GEOM::GEOM_IMeasureOperations_ptr aMeasureOp =
|
||||||
|
myGeomGUI->GetGeomGen()->GetIMeasureOperations(getStudyId());
|
||||||
|
double Ox, Oy, Oz, Zx, Zy, Zz, Xx, Xy, Xz;
|
||||||
|
|
||||||
|
aMeasureOp->GetPosition(theGeomObj.get(), Ox, Oy, Oz, Zx, Zy, Zz, Xx, Xy, Xz);
|
||||||
|
|
||||||
|
if (aMeasureOp->IsDone()) {
|
||||||
|
gp_Pnt aPnt (Ox, Oy, Oz);
|
||||||
|
gp_Dir aDirN (Zx, Zy, Zz);
|
||||||
|
gp_Dir aDirX (Xx, Xy, Xz);
|
||||||
|
aLCS = gp_Ax3(aPnt, aDirN, aDirX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return aLCS;
|
||||||
|
}
|
||||||
|
@ -26,10 +26,10 @@
|
|||||||
|
|
||||||
#include <GEOMBase_Skeleton.h>
|
#include <GEOMBase_Skeleton.h>
|
||||||
|
|
||||||
|
|
||||||
class CurveCreator_Curve;
|
class CurveCreator_Curve;
|
||||||
class CurveCreator_Widget;
|
class CurveCreator_Widget;
|
||||||
class QGroupBox;
|
class QGroupBox;
|
||||||
|
class QComboBox;
|
||||||
|
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
@ -84,21 +84,68 @@ private:
|
|||||||
GEOM::short_array &theTypes,
|
GEOM::short_array &theTypes,
|
||||||
GEOM::ListOfBool &theCloseds);
|
GEOM::ListOfBool &theCloseds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the current local coordinate system.
|
||||||
|
*
|
||||||
|
* \return local coordinate system.
|
||||||
|
*/
|
||||||
|
gp_Ax3 GetActiveLocalCS();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the current working plane. Can be null.
|
||||||
|
*
|
||||||
|
* \return the current working plane.
|
||||||
|
*/
|
||||||
|
GEOM::GeomObjPtr GetActiveWPlane();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method add a local coordinate system of the selected object.
|
||||||
|
*
|
||||||
|
* \param theSelectedObject the selected object. It can be a planar face
|
||||||
|
* or an inported polyline.
|
||||||
|
* \param IsPlane true for planar face; false for imported polyline.
|
||||||
|
* \param theLCS the local coordinate system.
|
||||||
|
*/
|
||||||
|
void AddLocalCS(GEOM::GeomObjPtr theSelectedObject,
|
||||||
|
const bool IsPlane,
|
||||||
|
const gp_Ax3 &theLCS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method converts the working plane object into
|
||||||
|
* the local coordinate system of the polyline.
|
||||||
|
*
|
||||||
|
* \param theGeomObj the working plane
|
||||||
|
* \return the local coordinate system
|
||||||
|
*/
|
||||||
|
gp_Ax3 WPlaneToLCS(GEOM::GeomObjPtr theGeomObj);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
|
|
||||||
void ClickOnOk();
|
void ClickOnOk();
|
||||||
bool ClickOnApply();
|
bool ClickOnApply();
|
||||||
|
void ClickOnCancel();
|
||||||
void processStartedSubOperation( QWidget*, bool );
|
void processStartedSubOperation( QWidget*, bool );
|
||||||
void processFinishedSubOperation( QWidget* );
|
void processFinishedSubOperation( QWidget* );
|
||||||
|
void SetEditCurrentArgument();
|
||||||
void SelectionIntoArgument();
|
void SelectionIntoArgument();
|
||||||
void ActivateThisDialog();
|
void ActivateThisDialog();
|
||||||
void onUpdatePreview();
|
void onUpdatePreview();
|
||||||
|
void ActivateLocalCS();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
CurveCreator_Curve *myCurve;
|
CurveCreator_Curve *myCurve;
|
||||||
CurveCreator_Widget *myEditorWidget;
|
CurveCreator_Widget *myEditorWidget;
|
||||||
QGroupBox *myAddElementBox;
|
QGroupBox *myAddElementBox;
|
||||||
|
QComboBox *myPlnComboBox;
|
||||||
|
QPushButton *myPlnButton;
|
||||||
|
QPushButton *myPlnSelButton;
|
||||||
|
QPushButton *myPolylineSelButton;
|
||||||
|
QLineEdit *myWPlaneLineEdit;
|
||||||
|
QLineEdit *myPolylineEdit;
|
||||||
|
QLineEdit *myEditCurrentArgument; /* Current LineEdit */
|
||||||
|
QList<gp_Ax3> myLCSList;
|
||||||
|
QList<GEOM::GeomObjPtr> myWPlaneList;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5597,6 +5597,10 @@ Ignoring units will cause model scaling (as dimensions are supposed to be specif
|
|||||||
<source>POLYLINE_NAME</source>
|
<source>POLYLINE_NAME</source>
|
||||||
<translation>Polyline</translation>
|
<translation>Polyline</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>POLYLINE_IMPORT</source>
|
||||||
|
<translation>Import polyline</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>POLYLINE_ADD_SECTION</source>
|
<source>POLYLINE_ADD_SECTION</source>
|
||||||
<translation>Add section</translation>
|
<translation>Add section</translation>
|
||||||
|
Loading…
Reference in New Issue
Block a user