lot 3 : curve creator : allow to move points on spline curve

This commit is contained in:
isn 2019-01-17 18:18:20 +03:00
parent 0d3e4210ae
commit e014eecb1b
5 changed files with 31 additions and 17 deletions

View File

@ -31,6 +31,7 @@
#include <AIS_Shape.hxx> #include <AIS_Shape.hxx>
#include <AIS_InteractiveObject.hxx> #include <AIS_InteractiveObject.hxx>
#include <Geom_CartesianPoint.hxx> #include <Geom_CartesianPoint.hxx>
#include <TopoDS_Iterator.hxx>
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <gp_Lin.hxx> #include <gp_Lin.hxx>
#include <TopoDS_Edge.hxx> #include <TopoDS_Edge.hxx>
@ -1063,25 +1064,29 @@ Handle(TColgp_HArray1OfPnt) CurveCreator_Curve::GetDifferentPoints( int theISect
CurveCreator_Section* aSection = (CurveCreator_Section*)getSection( theISection ); CurveCreator_Section* aSection = (CurveCreator_Section*)getSection( theISection );
return aSection ? aSection->GetDifferentPoints( (int)myDimension ) : Handle(TColgp_HArray1OfPnt)(); return aSection ? aSection->GetDifferentPoints( (int)myDimension ) : Handle(TColgp_HArray1OfPnt)();
} }
void CurveCreator_Curve::constructAISObject() void CurveCreator_Curve::constructAISObject()
{ {
//DEBTRACE("constructAISObject"); //DEBTRACE("constructAISObject");
TopoDS_Shape aShape; TopoDS_Shape aShape;
mySect2Wire.Clear(); mySect2Shape.Clear();
CurveCreator_Utils::constructShape( this, aShape, &mySect2Wire ); CurveCreator_Utils::constructShape( this, aShape, &mySect2Shape );
myAISShape = new AIS_ColoredShape( aShape ); myAISShape = new AIS_ColoredShape( aShape );
AIS_ColoredShape* AISColoredShape = dynamic_cast<AIS_ColoredShape*>(myAISShape); AIS_ColoredShape* AISColoredShape = dynamic_cast<AIS_ColoredShape*>(myAISShape);
std::map<int, TopoDS_Shape>::iterator it; std::map<int, TopoDS_Shape>::iterator it;
//for ( it = mySect2Wire.begin(); it != mySect2Wire.end(); it++ ) //for ( it = mySect2Shape.begin(); it != mySect2Shape.end(); it++ )
for (int i = 1; i <= mySect2Wire.Extent(); i++ ) for (int i = 1; i <= mySect2Shape.Extent(); i++ )
{ {
CurveCreator_Section* aSect = (CurveCreator_Section*)getSection(mySect2Wire.FindKey(i)); CurveCreator_Section* aSect = (CurveCreator_Section*)getSection(mySect2Shape.FindKey(i));
Quantity_Color aColor = aSect->myColor; Quantity_Color aColor = aSect->myColor;
const TopoDS_Shape& aWire = mySect2Wire.FindFromIndex(i); const TopoDS_Shape& aShape = mySect2Shape.FindFromIndex(i); //should contain: one wire + vertices
AISColoredShape->SetCustomColor(aWire, aColor); TopoDS_Iterator it(aShape);
for (;it.More();it.Next())
{
if (it.Value().ShapeType() == TopAbs_WIRE)
AISColoredShape->SetCustomColor(it.Value(), aColor);
}
} }
// myAISShape->SetColor( myCurveColor ); // myAISShape->SetColor( myCurveColor );

View File

@ -356,7 +356,7 @@ public:
Quantity_Color myPointAspectColor; Quantity_Color myPointAspectColor;
//Quantity_Color myCurveColor; //Quantity_Color myCurveColor;
double myLineWidth; double myLineWidth;
NCollection_IndexedDataMap<int, TopoDS_Shape> mySect2Wire; NCollection_IndexedDataMap<int, TopoDS_Shape> mySect2Shape;
std::vector<int> myCurSectInd; std::vector<int> myCurSectInd;
private: private:

View File

@ -295,11 +295,12 @@ TopoDS_Wire CurveCreator_Utils::ConstructWire(
//======================================================================= //=======================================================================
void CurveCreator_Utils::constructShape( void CurveCreator_Utils::constructShape(
const CurveCreator_ICurve* theCurve, TopoDS_Shape& theShape, const CurveCreator_ICurve* theCurve, TopoDS_Shape& theShape,
NCollection_IndexedDataMap<int, TopoDS_Shape>* theSect2Wire ) NCollection_IndexedDataMap<int, TopoDS_Shape>* theSect2Shape )
{ {
BRep_Builder aBuilder; BRep_Builder aBuilder;
TopoDS_Compound aShape; TopoDS_Compound aShape;
aBuilder.MakeCompound(aShape); aBuilder.MakeCompound(aShape);
const int aSectionCount = theCurve->getNbSections(); const int aSectionCount = theCurve->getNbSections();
for (int aSectionI = 0; aSectionI < aSectionCount; ++aSectionI) for (int aSectionI = 0; aSectionI < aSectionCount; ++aSectionI)
{ {
@ -314,10 +315,18 @@ void CurveCreator_Utils::constructShape(
const int aPointCount = aPoints->Length(); const int aPointCount = aPoints->Length();
const bool isClosed = theCurve->isClosed(aSectionI); const bool isClosed = theCurve->isClosed(aSectionI);
TopoDS_Compound ShapeWireWithV;
if (theSect2Shape)
aBuilder.MakeCompound(ShapeWireWithV);
// Add the vertices to the shape. // Add the vertices to the shape.
for (Standard_Integer aPN = 1; aPN <= aPointCount; ++aPN) for (Standard_Integer aPN = 1; aPN <= aPointCount; ++aPN)
{ {
aBuilder.Add(aShape, BRepBuilderAPI_MakeVertex(aPoints->Value(aPN))); TopoDS_Vertex V;
aBuilder.MakeVertex(V,aPoints->Value(aPN),Precision::Confusion());
aBuilder.Add(aShape, V);
if (theSect2Shape)
aBuilder.Add(ShapeWireWithV, V);
} }
// Add the wire to the shape. // Add the wire to the shape.
@ -327,10 +336,10 @@ void CurveCreator_Utils::constructShape(
if (!aWire.IsNull()) if (!aWire.IsNull())
{ {
aBuilder.Add(aShape, aWire); aBuilder.Add(aShape, aWire);
if (theSect2Wire) if (theSect2Shape)
{ {
//CurveCreator_Section* aSection = (CurveCreator_Section*)theCurve->getSection(aSectionI); aBuilder.Add(ShapeWireWithV, aWire);
(*theSect2Wire).Add(aSectionI, aWire); (*theSect2Shape).Add(aSectionI, ShapeWireWithV);
} }
} }
} }

View File

@ -87,11 +87,11 @@ public:
* Generates shape on the curve * Generates shape on the curve
* \param theCurve a curve object, that contains data * \param theCurve a curve object, that contains data
* \param theShape a generated shape * \param theShape a generated shape
* \param Sect2Wire optional out map: section to constructed wire * \param Sect2Shape optional out map: section to constructed shape (wire+vertices)
*/ */
CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve, CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve,
TopoDS_Shape& theShape, TopoDS_Shape& theShape,
NCollection_IndexedDataMap<int, TopoDS_Shape>* Sect2Wire = NULL); NCollection_IndexedDataMap<int, TopoDS_Shape>* Sect2Shape = NULL);
/** /**
* Generates a curve from a shape. * Generates a curve from a shape.

View File

@ -1174,7 +1174,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
for (int i=0; i<Curve->myCurSectInd.size(); i++) for (int i=0; i<Curve->myCurSectInd.size(); i++)
{ {
int sectInd = Curve->myCurSectInd[i]; int sectInd = Curve->myCurSectInd[i];
const TopoDS_Shape& W = Curve->mySect2Wire(sectInd+1); const TopoDS_Shape& W = Curve->mySect2Shape(sectInd+1);
TopExp_Explorer exp(W, TopAbs_VERTEX); TopExp_Explorer exp(W, TopAbs_VERTEX);
for (;exp.More();exp.Next()) for (;exp.More();exp.Next())
filter->AddShape(exp.Current()); filter->AddShape(exp.Current());