ENDIF(UNIX)
#IF(CMAKE_BUILD_TYPE MATCHES Release)
- ADD_SUBDIRECTORY (doc)
+ADD_SUBDIRECTORY (doc)
#ENDIF(CMAKE_BUILD_TYPE MATCHES Release)
ADD_SUBDIRECTORY (src/Config)
ADD_SUBDIRECTORY (src/Events)
return;
Quantity_Color aColor = anAIS->Color();
- theR = aColor.Red()*255.;
- theG = aColor.Green()*255.;
- theB = aColor.Blue()*255.;
+ theR = (int)(aColor.Red()*255.);
+ theG = (int)(aColor.Green()*255.);
+ theB = (int)(aColor.Blue()*255.);
}
bool GeomAPI_AISObject::empty() const
#define DEB_PLACEMENT 1
GeomAlgoAPI_Placement::GeomAlgoAPI_Placement(
- std::shared_ptr<GeomAPI_Shape> theSourceSolid,
- std::shared_ptr<GeomAPI_Shape> theDestSolid,
- std::shared_ptr<GeomAPI_Shape> theSourceShape,
- std::shared_ptr<GeomAPI_Shape> theDestShape,
- bool theIsReverse,
- bool theIsCentering)
+ std::shared_ptr<GeomAPI_Shape> theSourceSolid,
+ std::shared_ptr<GeomAPI_Shape> theDestSolid,
+ std::shared_ptr<GeomAPI_Shape> theSourceShape,
+ std::shared_ptr<GeomAPI_Shape> theDestShape,
+ bool theIsReverse,
+ bool theIsCentering)
: myDone(false),
- myShape(new GeomAPI_Shape())
+ myShape(new GeomAPI_Shape())
{
build(theSourceSolid, theDestSolid, theSourceShape, theDestShape, theIsReverse, theIsCentering);
}
void GeomAlgoAPI_Placement::build(
- const std::shared_ptr<GeomAPI_Shape>& theSourceSolid,
- const std::shared_ptr<GeomAPI_Shape>& theDestSolid,
- const std::shared_ptr<GeomAPI_Shape>& theSourceShape,
- const std::shared_ptr<GeomAPI_Shape>& theDestShape,
- bool theIsReverse,
- bool theIsCentering)
+ const std::shared_ptr<GeomAPI_Shape>& theSourceSolid,
+ const std::shared_ptr<GeomAPI_Shape>& theDestSolid,
+ const std::shared_ptr<GeomAPI_Shape>& theSourceShape,
+ const std::shared_ptr<GeomAPI_Shape>& theDestShape,
+ bool theIsReverse,
+ bool theIsCentering)
{
// Filling the parameters of the objects
static const int aNbObjects = 2;
hasDirection[i] = aSrcDstDirections[i].SquareMagnitude() >= Precision::SquareConfusion();
}
+ // Initial shapes
+ const TopoDS_Shape& aSourceShape = theSourceSolid->impl<TopoDS_Shape>();
+ const TopoDS_Shape& aDestShape = theDestSolid->impl<TopoDS_Shape>();
+ // Check the material of the solids to be on the correct side
+ BRepClass3d_SolidClassifier aClassifier;
+ static const double aTransStep = 10. * Precision::Confusion();
+ if (hasNormal[0]) {
+ aClassifier.Load(aSourceShape);
+ gp_Pnt aPoint = aSrcDstPoints[0];
+ aPoint.Translate(aSrcDstNormals[0] * aTransStep);
+ aClassifier.Perform(aPoint, Precision::Confusion());
+ if ((aClassifier.State() == TopAbs_OUT && !theIsReverse) ||
+ (aClassifier.State() == TopAbs_IN && theIsReverse))
+ aSrcDstNormals[0].Reverse();
+ }
+ if (hasNormal[1]) {
+ aClassifier.Load(aDestShape);
+ gp_Pnt aPoint = aSrcDstPoints[1];
+ aPoint.Translate(aSrcDstNormals[1] * aTransStep);
+ aClassifier.Perform(aPoint, Precision::Confusion());
+ if (aClassifier.State() == TopAbs_IN)
+ aSrcDstNormals[1].Reverse();
+ }
+
// Calculate directions, which comply the normal, for vertices and edges
if (!hasNormal[0] || !hasNormal[1]) {
if (hasNormal[0] || hasNormal[1]) { // plane with line or vertex
gp_Vec aVec = aSrcDstNormals[1 - anInd].Crossed(aSrcDstDirections[anInd]);
if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // normal and direction are collinear
aVec = aSrcDstNormals[1 - anInd].Crossed(
- gp_Vec(aSrcDstPoints[1 - anInd], aSrcDstPoints[anInd]));
+ gp_Vec(aSrcDstPoints[1 - anInd], aSrcDstPoints[anInd]));
if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // normal and points direction are collinear
if (Abs(aSrcDstNormals[1 - anInd].Y()) >= Precision::Confusion() ||
- Abs(aSrcDstNormals[1 - anInd].Z()) >= Precision::Confusion())
+ Abs(aSrcDstNormals[1 - anInd].Z()) >= Precision::Confusion())
aVec = gp::DX();
else
aVec = gp::DY();
aVec = aSrcDstDirections[0].Crossed(gp_Vec(aSrcDstPoints[0], aSrcDstPoints[1]));
if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // lines are equal
if (Abs(aSrcDstDirections[0].Y()) >= Precision::Confusion() ||
- Abs(aSrcDstDirections[0].Z()) >= Precision::Confusion())
+ Abs(aSrcDstDirections[0].Z()) >= Precision::Confusion())
aVec = gp::DX();
else
aVec = gp::DY();
}
aSrcDstNormals[0] = aSrcDstDirections[0].Crossed(aVec);
aSrcDstNormals[0].Normalize();
- aSrcDstNormals[1] = aSrcDstDirections[1].Crossed(aVec).Reversed();
+ aSrcDstNormals[1] = aSrcDstDirections[1].Crossed(aVec);
aSrcDstNormals[1].Normalize();
+ if (aSrcDstDirections[0].Dot(aSrcDstDirections[1]) < -Precision::Confusion())
+ aSrcDstNormals[1].Reverse();
} else if (!hasDirection[0] && !hasDirection[1]) { // point - point
aSrcDstNormals[0] = gp_Vec(aSrcDstPoints[0], aSrcDstPoints[1]);
aSrcDstNormals[0].Normalize();
aVec.Cross(aSrcDstDirections[anInd]);
if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // point is on line
if (Abs(aSrcDstDirections[1 - anInd].Y()) >= Precision::Confusion() ||
- Abs(aSrcDstDirections[1 - anInd].Z()) >= Precision::Confusion())
+ Abs(aSrcDstDirections[1 - anInd].Z()) >= Precision::Confusion())
aVec = gp::DX();
else
aVec = gp::DY();
}
}
- // Initial shapes
- const TopoDS_Shape& aSourceShape = theSourceSolid->impl<TopoDS_Shape>();
- const TopoDS_Shape& aDestShape = theDestSolid->impl<TopoDS_Shape>();
+ // Reverse the normal if it was not done before
+ if (!hasNormal[0] && theIsReverse)
+ aSrcDstNormals[0].Reverse();
// Calculate transformation
gp_Trsf aTrsf;
gp_Vec aSrcDir = aSrcDstNormals[0];
gp_Vec aDstDir = aSrcDstNormals[1];
- // Check the material of the solids to be on the correct side
- BRepClass3d_SolidClassifier aClassifier;
- static const double aTransStep = 10. * Precision::Confusion();
- if (hasNormal[0]) {
- aClassifier.Load(aSourceShape);
- gp_Pnt aPoint = aSrcDstPoints[0];
- aPoint.Translate(aSrcDir * aTransStep);
- aClassifier.Perform(aPoint, Precision::Confusion());
- if ((aClassifier.State() == TopAbs_OUT && !theIsReverse) ||
- (aClassifier.State() == TopAbs_IN && theIsReverse))
- aSrcDir.Reverse();
- } else if (theIsReverse)
- aSrcDir.Reverse();
- if (hasNormal[1]) {
- aClassifier.Load(aDestShape);
- gp_Pnt aPoint = aSrcDstPoints[1];
- aPoint.Translate(aDstDir * aTransStep);
- aClassifier.Perform(aPoint, Precision::Confusion());
- if (aClassifier.State() == TopAbs_IN)
- aDstDir.Reverse();
- }
// Calculate rotation
gp_Quaternion aRot(aSrcDir, aDstDir);
aTrsf.SetRotation(aRot);
myMap.bind(aCurrentShape, aCurrentShape);
}
#ifdef DEB_PLACEMENT
- int aNum = myMap.size();
- cout << "MAP of Oriented shapes =" << aNum <<endl;
+ int aNum = myMap.size();
+ cout << "MAP of Oriented shapes =" << aNum <<endl;
#endif
{
if (myImpl)
myMap.clear();
-}
\ No newline at end of file
+}
{
std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
myRef->Append(aData->label().Father()); // store label of the object
+ // do it before the transaction finish to make just created/removed objects know dependencies
+ // and reference from composite feature is removed automatically
+ FeaturePtr anOwnerFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(owner());
+ if (anOwnerFeature.get()) {
+ aData->addBackReference(anOwnerFeature, id());
+ }
owner()->data()->sendAttributeUpdated(this);
}
if(!theObject)
return;
if (!myIsInitialized || value() != theObject) {
- std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(
- theObject->data());
- TDF_Label anObjLab = aData->label().Father(); // object label
+ std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(
+ theObject->data());
+ TDF_Label anObjLab = aData->label().Father(); // object label
if (owner()->document() == theObject->document()) { // same document, use reference attribute
TDF_Tool::Entry(anObjLab, anEntry);
TDataStd_AsciiString::Set(myRef->Label(), anEntry);
}
+ // do it before the transaction finish to make just created/removed objects know dependencies
+ // and reference from composite feature is removed automatically
+ FeaturePtr anOwnerFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(owner());
+ if (anOwnerFeature.get()) {
+ aData->addBackReference(anOwnerFeature, id());
+ }
owner()->data()->sendAttributeUpdated(this);
}
#include <ModelAPI_CompositeFeature.h>
#include <GeomAPI_Shape.h>
#include <GeomAPI_PlanarEdges.h>
-#include <GeomAlgoAPI_SketchBuilder.h>
#include <Events_Error.h>
#include <TNaming_Selector.hxx>
} else if (aContext->groupName() == ModelAPI_ResultConstruction::group()) {
// construction: identification by the results indexes, recompute faces and
// take the face that more close by the indexes
- std::shared_ptr<GeomAPI_PlanarEdges> aWirePtr =
- std::dynamic_pointer_cast<GeomAPI_PlanarEdges>(
- std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext)->shape());
- if (aWirePtr && aWirePtr->hasPlane()) { // sketch sub-element
+ ResultConstructionPtr aConstructionContext =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
+ // sketch sub-element
+ if (aConstructionContext &&
+ std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aContext).get())
+ {
TDF_Label aLab = myRef.myRef->Label();
// getting a type of selected shape
Handle(TDataStd_Integer) aTypeAttr;
if (aShapeType == TopAbs_FACE) { // compound is for the whole sketch selection
// If this is a wire with plane defined thin it is a sketch-like object
- std::list<std::shared_ptr<GeomAPI_Shape> > aFaces;
- GeomAlgoAPI_SketchBuilder::createFaces(aWirePtr->origin(), aWirePtr->dirX(),
- aWirePtr->dirY(), aWirePtr->norm(), aWirePtr, aFaces);
- if (aFaces.empty()) // no faces, update can not work correctly
+ if (!aConstructionContext->facesNum()) // no faces, update can not work correctly
return false;
// if there is no edges indexes, any face can be used: take the first
std::shared_ptr<GeomAPI_Shape> aNewSelected;
if (aNoIndexes) {
- aNewSelected = *(aFaces.begin());
+ aNewSelected = aConstructionContext->face(0);
} else { // searching for most looks-like initial face by the indexes
// prepare edges of the current resut for the fast searching
TColStd_MapOfTransient allCurves;
}
}
}
- // iterate new result faces and searching for these edges
- std::list<std::shared_ptr<GeomAPI_Shape> >::iterator aFacesIter = aFaces.begin();
double aBestFound = 0; // best percentage of found edges
- for(; aFacesIter != aFaces.end(); aFacesIter++) {
+ for(int aFaceIndex = 0; aFaceIndex < aConstructionContext->facesNum(); aFaceIndex++) {
int aFound = 0, aNotFound = 0;
- TopExp_Explorer anEdgesExp((*aFacesIter)->impl<TopoDS_Shape>(), TopAbs_EDGE);
+ TopExp_Explorer anEdgesExp(
+ aConstructionContext->face(aFaceIndex)->impl<TopoDS_Shape>(), TopAbs_EDGE);
for(; anEdgesExp.More(); anEdgesExp.Next()) {
TopoDS_Edge anEdge = TopoDS::Edge(anEdgesExp.Current());
if (!anEdge.IsNull()) {
double aPercentage = double(aFound) / double(aFound + aNotFound);
if (aPercentage > aBestFound) {
aBestFound = aPercentage;
- aNewSelected = *aFacesIter;
+ aNewSelected = aConstructionContext->face(aFaceIndex);
}
}
}
#include "ModuleBase_ResultPrs.h"
#include <ModelAPI_Tools.h>
+#include <ModelAPI_ResultConstruction.h>
#include <GeomAPI_PlanarEdges.h>
-#include <GeomAlgoAPI_SketchBuilder.h>
#include <BRep_Builder.hxx>
#include <AIS_Drawer.hxx>
if (!aShapePtr)
return;
if (myIsSketchMode) {
- std::shared_ptr<GeomAPI_PlanarEdges> aWirePtr =
- std::dynamic_pointer_cast<GeomAPI_PlanarEdges>(aShapePtr);
myFacesList.clear();
- GeomAlgoAPI_SketchBuilder::createFaces(aWirePtr->origin(), aWirePtr->dirX(),
- aWirePtr->dirY(), aWirePtr->norm(), aWirePtr, myFacesList);
+ ResultConstructionPtr aConstruction =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(myResult);
+ if (aConstruction.get()) {
+ int aFacesNum = aConstruction->facesNum();
+ for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) {
+ myFacesList.push_back(aConstruction->face(aFaceIndex));
+ }
+ }
}
myOriginalShape = aShapePtr->impl<TopoDS_Shape>();
if (!myOriginalShape.IsNull()) {
<file>icons/vertical.png</file>
<file>icons/equal.png</file>
<file>icons/tangent.png</file>
+ <file>icons/fillet.png</file>
</qresource>
</RCC>
if (!aData->isValid())
return;
- std::shared_ptr<GeomDataAPI_Point2D> aPoint1 = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
- aData->attribute(SketchPlugin_Arc::CENTER_ID()));
- aPoint1->move(theDeltaX, theDeltaY);
-
myStartUpdate = true;
myEndUpdate = true;
std::shared_ptr<GeomDataAPI_Point2D> aPoint2 = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
aPoint3->move(theDeltaX, theDeltaY);
myStartUpdate = false;
myEndUpdate = false;
+
+ std::shared_ptr<GeomDataAPI_Point2D> aPoint1 = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ aData->attribute(SketchPlugin_Arc::CENTER_ID()));
+ aPoint1->move(theDeltaX, theDeltaY);
}
double SketchPlugin_Arc::distanceToPoint(const std::shared_ptr<GeomAPI_Pnt2d>& thePoint)
}
bool SketchPlugin_Arc::isFixed() {
- return data()->selection(EXTERNAL_ID())->context().get();
+ return data()->selection(EXTERNAL_ID())->context().get() != NULL;
}
bool SketchPlugin_Arc::isFeatureValid()
}
bool SketchPlugin_Circle::isFixed() {
- return data()->selection(EXTERNAL_ID())->context().get();
+ return data()->selection(EXTERNAL_ID())->context().get() != NULL;
}
void SketchPlugin_Circle::attributeChanged(const std::string& theID) {
}
bool SketchPlugin_Line::isFixed() {
- return data()->selection(EXTERNAL_ID())->context().get();
+ return data()->selection(EXTERNAL_ID())->context().get() != NULL;
}
void SketchPlugin_Line::attributeChanged(const std::string& theID) {
}
bool SketchPlugin_Point::isFixed() {
- return data()->selection(EXTERNAL_ID())->context().get();
+ return data()->selection(EXTERNAL_ID())->context().get() != NULL;
}
void SketchPlugin_Point::attributeChanged(const std::string& theID) {
aBigWire->addEdge(*aShapeIt);
}
aBigWire->setPlane(anOrigin->pnt(), aDirX->dir(), aNorm->dir());
-
-// GeomAlgoAPI_SketchBuilder::createFaces(anOrigin->pnt(), aDirX->dir(), aDirY->dir(), aNorm->dir(),
-// aFeaturesPreview, aLoops, aWires);
std::shared_ptr<ModelAPI_ResultConstruction> aConstr = document()->createConstruction(data());
aConstr->setShape(aBigWire);
setResult(aConstr);
title="Mirror"
tooltip="Create constraint mirroring group of objects"
internal="1" />
- <!-- SketchConstraintFillet -->
- <feature id="SketchConstraintFillet" title="Fillet" tooltip="Create constraint defining fillet between two objects">
+ </group>
+ <group id="Edit">
+ <!-- SketchConstraintFillet -->
+ <feature id="SketchConstraintFillet" title="Fillet" tooltip="Create constraint defining fillet between two objects" icon=":icons/fillet.png">
<sketch_constraint_shape_selector id="ConstraintEntityA"
label="First object" tooltip="Select line or arc" shape_types="edge">
</sketch_constraint_shape_selector>