//======================================================================= //function : takePlane //purpose : local function returns plane of given edges //======================================================================= static Standard_Boolean takePlane( const TopoDS_Edge& theE1, const TopoDS_Edge& theE2, const TopoDS_Vertex& theV, gp_Pln& thePlane ) { TopoDS_Vertex aV12 = anotherVertex( theE1, theV ); TopoDS_Vertex aV22 = anotherVertex( theE2, theV ); // check can closed wire be created by two initial edges if ( aV12.IsNull() || aV22.IsNull() || aV12.IsSame( aV22 ) ) return false; // create plane by 3 points gp_XYZ aXYZ = BRep_Tool::Pnt( theV ).XYZ(); gp_XYZ aXYZ1 = BRep_Tool::Pnt( aV12 ).XYZ(); gp_XYZ aXYZ2 = BRep_Tool::Pnt( aV22 ).XYZ(); try { gp_Dir aDir1( aXYZ - aXYZ1 ); gp_Dir aDir2( aXYZ2 - aXYZ ); Standard_Real anAngle = aDir1.Angle(aDir2); if ( fabs(anAngle) <= gp::Resolution() || fabs(anAngle - M_PI) <= gp::Resolution() ) return false; thePlane = gp_Pln( gp_Pnt(aXYZ), aDir1^ aDir2); } catch (Standard_Failure) { return false; } return true; }
gp_Pln IfcGeom::plane_from_face(const TopoDS_Face& face) { BRepGProp_Face prop(face); Standard_Real u1,u2,v1,v2; prop.Bounds(u1,u2,v1,v2); Standard_Real u = (u1+u2)/2.0; Standard_Real v = (v1+v2)/2.0; gp_Pnt p; gp_Vec n; prop.Normal(u,v,p,n); return gp_Pln(p,n); }
TopoDS_Face buildEtaCutFace(const CTiglWingStructureReference& wsr, double eta) { // NOTE: we have to determine the cut plane by using the // GetMidplaneOrChordlinePoint methods for handling the case when the eta line // is extended because of an z-rotation of the outer or inner sections gp_Pnt startPnt = wsr.GetMidplaneOrChordlinePoint(eta, 0); gp_Pnt endPnt = wsr.GetMidplaneOrChordlinePoint(eta, 1); gp_Vec midplaneNormal = wsr.GetMidplaneNormal(eta); gp_Dir cutPlaneNormal = midplaneNormal.Crossed(gp_Vec(startPnt, endPnt)); gp_Pln etaCutPlane = gp_Pln(startPnt, cutPlaneNormal); return BRepBuilderAPI_MakeFace(etaCutPlane); }
gp_Pln Feature::makePlnFromPlane(const App::DocumentObject* obj) { const App::GeoFeature* plane = static_cast<const App::GeoFeature*>(obj); if (plane == NULL) throw Base::Exception("Feature: Null object"); Base::Vector3d pos = plane->Placement.getValue().getPosition(); Base::Rotation rot = plane->Placement.getValue().getRotation(); Base::Vector3d normal(0,0,1); rot.multVec(normal, normal); return gp_Pln(gp_Pnt(pos.x,pos.y,pos.z), gp_Dir(normal.x,normal.y,normal.z)); }
//================================================================ // Function : DrawCurve // Purpose : displays a given curve 2d //================================================================ Handle_AIS_InteractiveObject OCCDemo_Presentation::drawCurve (const Handle_Geom2d_Curve& theCurve, const Quantity_Color& theColor, const Standard_Boolean toDisplay, const gp_Ax2& aPosition) { // create 3D curve in plane Handle(Geom_Curve) aCurve3d; if (theCurve->IsKind(STANDARD_TYPE(Geom2d_OffsetCurve))) { Handle(Geom2d_OffsetCurve) aOffCurve = Handle(Geom2d_OffsetCurve)::DownCast(theCurve); Handle(Geom_Curve) aBasCurve3d = GeomAPI::To3d (aOffCurve->BasisCurve(), gp_Pln(aPosition)); Standard_Real aDist = aOffCurve->Offset(); aCurve3d = new Geom_OffsetCurve (aBasCurve3d, aDist, aPosition.Direction()); } else { aCurve3d = GeomAPI::To3d (theCurve, gp_Pln(aPosition)); } return drawCurve (aCurve3d, theColor, toDisplay); }
bool IfcGeom::convert(const Ifc2x3::IfcPlane::ptr pln, gp_Pln& plane) { IN_CACHE(IfcPlane,pln,gp_Pln,plane) Ifc2x3::IfcAxis2Placement3D::ptr l = pln->Position(); gp_Pnt o;gp_Dir axis = gp_Dir(0,0,1);gp_Dir refDirection; IfcGeom::convert(l->Location(),o); bool hasRef = l->hasRefDirection(); if ( l->hasAxis() ) IfcGeom::convert(l->Axis(),axis); if ( hasRef ) IfcGeom::convert(l->RefDirection(),refDirection); gp_Ax3 ax3; if ( hasRef ) ax3 = gp_Ax3(o,axis,refDirection); else ax3 = gp_Ax3(o,axis); plane = gp_Pln(ax3); CACHE(IfcPlane,pln,plane) return true; }
bool IfcGeom::Kernel::convert(const IfcSchema::IfcCenterLineProfileDef* l, TopoDS_Shape& face) { const double d = l->Thickness() * getValue(GV_LENGTH_UNIT) / 2.; TopoDS_Wire wire; if (!convert_wire(l->Curve(), wire)) return false; // BRepOffsetAPI_MakeOffset insists on creating circular arc // segments for joining the curves that constitute the center // line. This is probably not in accordance with the IFC spec. // Although it does not specify a method to join segments // explicitly, it does dictate 'a constant thickness along the // curve'. Therefore for simple singular wires a quick // alternative is provided that uses a straight join. TopExp_Explorer exp(wire, TopAbs_EDGE); TopoDS_Edge edge = TopoDS::Edge(exp.Current()); exp.Next(); if (!exp.More()) { double u1, u2; Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, u1, u2); Handle(Geom_TrimmedCurve) trim = new Geom_TrimmedCurve(curve, u1, u2); Handle(Geom_OffsetCurve) c1 = new Geom_OffsetCurve(trim, d, gp::DZ()); Handle(Geom_OffsetCurve) c2 = new Geom_OffsetCurve(trim, -d, gp::DZ()); gp_Pnt c1a, c1b, c2a, c2b; c1->D0(c1->FirstParameter(), c1a); c1->D0(c1->LastParameter(), c1b); c2->D0(c2->FirstParameter(), c2a); c2->D0(c2->LastParameter(), c2b); BRepBuilderAPI_MakeWire mw; mw.Add(BRepBuilderAPI_MakeEdge(c1)); mw.Add(BRepBuilderAPI_MakeEdge(c1a, c2a)); mw.Add(BRepBuilderAPI_MakeEdge(c2)); mw.Add(BRepBuilderAPI_MakeEdge(c2b, c1b)); face = BRepBuilderAPI_MakeFace(mw.Wire()); } else { BRepOffsetAPI_MakeOffset offset(BRepBuilderAPI_MakeFace(gp_Pln(gp::Origin(), gp::DZ()))); offset.AddWire(wire); offset.Perform(d); face = BRepBuilderAPI_MakeFace(TopoDS::Wire(offset)); } return true; }
void occQt::makeRevol() { gp_Ax1 anAxis; // revol a vertex result is an edge. anAxis.SetLocation(gp_Pnt(0.0, 70.0, 0.0)); TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(gp_Pnt(2.0, 70.0, 0.0)); TopoDS_Shape aRevolVertex = BRepPrimAPI_MakeRevol(aVertex, anAxis); Handle_AIS_Shape anAisRevolVertex = new AIS_Shape(aRevolVertex); // revol an edge result is a face. anAxis.SetLocation(gp_Pnt(8.0, 70.0, 0.0)); TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(gp_Pnt(6.0, 70.0, 0.0), gp_Pnt(6.0, 70.0, 5.0)); TopoDS_Shape aRevolEdge = BRepPrimAPI_MakeRevol(anEdge, anAxis); Handle_AIS_Shape anAisRevolEdge = new AIS_Shape(aRevolEdge); // revol a wire result is a shell. anAxis.SetLocation(gp_Pnt(20.0, 70.0, 0.0)); anAxis.SetDirection(gp::DY()); TopoDS_Edge aCircleEdge = BRepBuilderAPI_MakeEdge(gp_Circ(gp_Ax2(gp_Pnt(15.0, 70.0, 0.0), gp::DZ()), 1.5)); TopoDS_Wire aCircleWire = BRepBuilderAPI_MakeWire(aCircleEdge); TopoDS_Shape aRevolCircle = BRepPrimAPI_MakeRevol(aCircleWire, anAxis, M_PI_2); Handle_AIS_Shape anAisRevolCircle = new AIS_Shape(aRevolCircle); // revol a face result is a solid. anAxis.SetLocation(gp_Pnt(30.0, 70.0, 0.0)); anAxis.SetDirection(gp::DY()); TopoDS_Edge aEllipseEdge = BRepBuilderAPI_MakeEdge(gp_Elips(gp_Ax2(gp_Pnt(25.0, 70.0, 0.0), gp::DZ()), 3.0, 2.0)); TopoDS_Wire aEllipseWire = BRepBuilderAPI_MakeWire(aEllipseEdge); TopoDS_Face aEllipseFace = BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY()), aEllipseWire); TopoDS_Shape aRevolEllipse = BRepPrimAPI_MakeRevol(aEllipseFace, anAxis, M_PI_4); Handle_AIS_Shape anAisRevolEllipse = new AIS_Shape(aRevolEllipse); anAisRevolVertex->SetColor(Quantity_NOC_LIMEGREEN); anAisRevolEdge->SetColor(Quantity_NOC_LINEN); anAisRevolCircle->SetColor(Quantity_NOC_MAGENTA1); anAisRevolEllipse->SetColor(Quantity_NOC_MAROON); mContext->Display(anAisRevolVertex); mContext->Display(anAisRevolEdge); mContext->Display(anAisRevolCircle); mContext->Display(anAisRevolEllipse); }
void CFace::GetPlaneParams(gp_Pln &p) { // returns a plane for the underlying surface BRepAdaptor_Surface surface(m_topods_face, Standard_True); GeomAbs_SurfaceType surface_type = surface.GetType(); if(surface_type == GeomAbs_Plane) { p = surface.Plane(); } else { IsAPlane(&p); if( m_topods_face.Orientation()== TopAbs_REVERSED ) { p = gp_Pln(p.Axis().Location(), -p.Axis().Direction()); } } }
void occQt::makeExtrude() { // prism a vertex result is an edge. TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(gp_Pnt(0.0, 60.0, 0.0)); TopoDS_Shape aPrismVertex = BRepPrimAPI_MakePrism(aVertex, gp_Vec(0.0, 0.0, 5.0)); Handle_AIS_Shape anAisPrismVertex = new AIS_Shape(aPrismVertex); // prism an edge result is a face. TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(gp_Pnt(5.0, 60.0, 0.0), gp_Pnt(10.0, 60.0, 0.0)); TopoDS_Shape aPrismEdge = BRepPrimAPI_MakePrism(anEdge, gp_Vec(0.0, 0.0, 5.0)); Handle_AIS_Shape anAisPrismEdge = new AIS_Shape(aPrismEdge); // prism a wire result is a shell. gp_Ax2 anAxis; anAxis.SetLocation(gp_Pnt(16.0, 60.0, 0.0)); TopoDS_Edge aCircleEdge = BRepBuilderAPI_MakeEdge(gp_Circ(anAxis, 3.0)); TopoDS_Wire aCircleWire = BRepBuilderAPI_MakeWire(aCircleEdge); TopoDS_Shape aPrismCircle = BRepPrimAPI_MakePrism(aCircleWire, gp_Vec(0.0, 0.0, 5.0)); Handle_AIS_Shape anAisPrismCircle = new AIS_Shape(aPrismCircle); // prism a face or a shell result is a solid. anAxis.SetLocation(gp_Pnt(24.0, 60.0, 0.0)); TopoDS_Edge aEllipseEdge = BRepBuilderAPI_MakeEdge(gp_Elips(anAxis, 3.0, 2.0)); TopoDS_Wire aEllipseWire = BRepBuilderAPI_MakeWire(aEllipseEdge); TopoDS_Face aEllipseFace = BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY()), aEllipseWire); TopoDS_Shape aPrismEllipse = BRepPrimAPI_MakePrism(aEllipseFace, gp_Vec(0.0, 0.0, 5.0)); Handle_AIS_Shape anAisPrismEllipse = new AIS_Shape(aPrismEllipse); anAisPrismVertex->SetColor(Quantity_NOC_PAPAYAWHIP); anAisPrismEdge->SetColor(Quantity_NOC_PEACHPUFF); anAisPrismCircle->SetColor(Quantity_NOC_PERU); anAisPrismEllipse->SetColor(Quantity_NOC_PINK); mContext->Display(anAisPrismVertex); mContext->Display(anAisPrismEdge); mContext->Display(anAisPrismCircle); mContext->Display(anAisPrismEllipse); }
void SvgSerializer::write(const IfcGeom::BRepElement<double>* o) { IfcSchema::IfcBuildingStorey* storey = 0; IfcSchema::IfcObjectDefinition* obdef = static_cast<IfcSchema::IfcObjectDefinition*>(file->entityById(o->id())); #ifndef USE_IFC4 typedef IfcSchema::IfcRelDecomposes decomposition_element; #else typedef IfcSchema::IfcRelAggregates decomposition_element; #endif while (true) { // Iterate over the decomposing element to find the parent IfcBuildingStorey decomposition_element::list::ptr decomposes = obdef->Decomposes(); if (!decomposes->size()) { if (obdef->is(IfcSchema::Type::IfcElement)) { IfcSchema::IfcRelContainedInSpatialStructure::list::ptr containment = ((IfcSchema::IfcElement*)obdef)->ContainedInStructure(); if (!containment->size()) { break; } for (IfcSchema::IfcRelContainedInSpatialStructure::list::it it = containment->begin(); it != containment->end(); ++it) { IfcSchema::IfcRelContainedInSpatialStructure* container = *it; if (container->RelatingStructure() != obdef) { obdef = container->RelatingStructure(); } } } else { break; } } else { for (decomposition_element::list::it it = decomposes->begin(); it != decomposes->end(); ++it) { decomposition_element* decompose = *it; if (decompose->RelatingObject() != obdef) { obdef = decompose->RelatingObject(); } } } if (obdef->is(IfcSchema::Type::IfcBuildingStorey)) { storey = static_cast<IfcSchema::IfcBuildingStorey*>(obdef); break; } } if (!storey) return; path_object& p = start_path(storey, nameElement(o)); for (IfcGeom::IfcRepresentationShapeItems::const_iterator it = o->geometry().begin(); it != o->geometry().end(); ++ it) { gp_GTrsf gtrsf = it->Placement(); gp_Trsf o_trsf; const std::vector<double>& matrix = o->transformation().matrix().data(); o_trsf.SetValues( matrix[0], matrix[3], matrix[6], matrix[ 9], matrix[1], matrix[4], matrix[7], matrix[10], matrix[2], matrix[5], matrix[8], matrix[11] #if OCC_VERSION_HEX < 0x60800 , Precision::Angular(), Precision::Confusion() #endif ); gtrsf.PreMultiply(o_trsf); const TopoDS_Shape& s = it->Shape(); bool trsf_valid = false; gp_Trsf trsf; try { trsf = gtrsf.Trsf(); trsf_valid = true; } catch (...) {} const TopoDS_Shape moved_shape = trsf_valid ? BRepBuilderAPI_Transform(s, trsf, true).Shape() : BRepBuilderAPI_GTransform(s, gtrsf, true).Shape(); const double inf = std::numeric_limits<double>::infinity(); double zmin = inf; double zmax = -inf; {TopExp_Explorer exp(moved_shape, TopAbs_VERTEX); for (; exp.More(); exp.Next()) { const TopoDS_Vertex& vertex = TopoDS::Vertex(exp.Current()); gp_Pnt pnt = BRep_Tool::Pnt(vertex); if (pnt.Z() < zmin) { zmin = pnt.Z(); } if (pnt.Z() > zmax) { zmax = pnt.Z(); } }} if (section_height) { if (zmin > section_height || zmax < section_height) continue; } else { if (zmin == inf || (zmax - zmin) < 1.) continue; } const double cut_z = section_height.get_value_or(zmin + 1.); // Create a horizontal cross section 1 meter above the bottom point of the shape TopoDS_Shape result = BRepAlgoAPI_Section(moved_shape, gp_Pln(gp_Pnt(0, 0, cut_z), gp::DZ())); Handle(TopTools_HSequenceOfShape) edges = new TopTools_HSequenceOfShape(); Handle(TopTools_HSequenceOfShape) wires = new TopTools_HSequenceOfShape(); {TopExp_Explorer exp(result, TopAbs_EDGE); for (; exp.More(); exp.Next()) { edges->Append(exp.Current()); }} ShapeAnalysis_FreeBounds::ConnectEdgesToWires(edges, 1e-5, false, wires); gp_Pnt prev; for (int i = 1; i <= wires->Length(); ++i) { const TopoDS_Wire& wire = TopoDS::Wire(wires->Value(i)); write(p, wire); } } }
//======================================================================= //function : HasIntersection3 //purpose : Auxilare for HasIntersection() // find intersection point between triangle (P1,P2,P3) // and segment [PC,P] //======================================================================= static bool HasIntersection3(const gp_Pnt& P, const gp_Pnt& PC, gp_Pnt& Pint, const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3) { //cout<<"HasIntersection3"<<endl; //cout<<" PC("<<PC.X()<<","<<PC.Y()<<","<<PC.Z()<<")"<<endl; //cout<<" P("<<P.X()<<","<<P.Y()<<","<<P.Z()<<")"<<endl; //cout<<" P1("<<P1.X()<<","<<P1.Y()<<","<<P1.Z()<<")"<<endl; //cout<<" P2("<<P2.X()<<","<<P2.Y()<<","<<P2.Z()<<")"<<endl; //cout<<" P3("<<P3.X()<<","<<P3.Y()<<","<<P3.Z()<<")"<<endl; gp_Vec VP1(P1,P2); gp_Vec VP2(P1,P3); IntAna_Quadric IAQ(gp_Pln(P1,VP1.Crossed(VP2))); IntAna_IntConicQuad IAICQ(gp_Lin(PC,gp_Dir(gp_Vec(PC,P))),IAQ); if(IAICQ.IsDone()) { if( IAICQ.IsInQuadric() ) return false; if( IAICQ.NbPoints() == 1 ) { gp_Pnt PIn = IAICQ.Point(1); double preci = 1.e-6; // check if this point is internal for segment [PC,P] bool IsExternal = ( (PC.X()-PIn.X())*(P.X()-PIn.X()) > preci ) || ( (PC.Y()-PIn.Y())*(P.Y()-PIn.Y()) > preci ) || ( (PC.Z()-PIn.Z())*(P.Z()-PIn.Z()) > preci ); if(IsExternal) { return false; } // check if this point is internal for triangle (P1,P2,P3) gp_Vec V1(PIn,P1); gp_Vec V2(PIn,P2); gp_Vec V3(PIn,P3); if( V1.Magnitude()<preci || V2.Magnitude()<preci || V3.Magnitude()<preci ) { Pint = PIn; return true; } gp_Vec VC1 = V1.Crossed(V2); gp_Vec VC2 = V2.Crossed(V3); gp_Vec VC3 = V3.Crossed(V1); if(VC1.Magnitude()<preci) { if(VC2.IsOpposite(VC3,preci)) { return false; } } else if(VC2.Magnitude()<preci) { if(VC1.IsOpposite(VC3,preci)) { return false; } } else if(VC3.Magnitude()<preci) { if(VC1.IsOpposite(VC2,preci)) { return false; } } else { if( VC1.IsOpposite(VC2,preci) || VC1.IsOpposite(VC3,preci) || VC2.IsOpposite(VC3,preci) ) { return false; } } Pint = PIn; return true; } } return false; }
///////////////////////////////////////////////////////////////////////////// // CViewer3dView message handlers gp_Pnt ConvertClickToPoint(Standard_Real x, Standard_Real y, Handle(V3d_View) aView) { V3d_Coordinate XEye,YEye,ZEye,XAt,YAt,ZAt; aView->Eye(XEye,YEye,ZEye); aView->At(XAt,YAt,ZAt); gp_Pnt EyePoint(XEye,YEye,ZEye); gp_Pnt AtPoint(XAt,YAt,ZAt); gp_Vec EyeVector(EyePoint,AtPoint); gp_Dir EyeDir(EyeVector); gp_Pln PlaneOfTheView = gp_Pln(AtPoint,EyeDir); Standard_Real X,Y,Z; aView->Convert(int(x),int(y),X,Y,Z); gp_Pnt ConvertedPoint(X,Y,Z); gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project(PlaneOfTheView,ConvertedPoint); gp_Pnt ResultPoint = ElSLib::Value(ConvertedPointOnPlane.X(), ConvertedPointOnPlane.Y(), PlaneOfTheView); return ResultPoint; } void CViewer3dView::OnSize(UINT nType, int cx, int cy) { if (!myView.IsNull()) myView->MustBeResized();