1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-01 10:26:12 +03:00
occt/src/DrawDim/DrawDim_PlanarDimensionCommands.cxx

345 lines
11 KiB
C++

// Created on: 1996-06-03
// Created by: Denis PASCAL
// Copyright (c) 1996-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <stdio.h>
#include <DrawDim.hxx>
#include <Draw_Interpretor.hxx>
#include <Draw_Appli.hxx>
#include <Draw.hxx>
#include <DBRep.hxx>
#include <DrawDim_PlanarDistance.hxx>
#include <DrawDim_PlanarRadius.hxx>
#include <DrawDim_PlanarAngle.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS.hxx>
#include <TopExp.hxx>
#include <Geom_Circle.hxx>
#include <BRep_Builder.hxx>
#include <gp_Pnt.hxx>
#include <gp_Circ.hxx>
#include <TopTools_MapOfShape.hxx>
#include <TopExp_Explorer.hxx>
#include <gp_Pln.hxx>
#include <DrawTrSurf.hxx>
//=======================================================================
//function : DrawDim_DISTANCE
//purpose :
//=======================================================================
static Standard_Integer DrawDim_DISTANCE (Draw_Interpretor& di,
Standard_Integer nb,
const char** arg)
{
if (nb == 1) {
di << "distance (name, profile[face],point1[vertex],point2[vertex])\n";
di << "distance (name, profile[face],line1[edge],line2[edge])\n";
di << "distance (name, profile[face],line[edge],point[vertex])\n";
}
else {
Handle(DrawDim_PlanarDistance) DIST;
if (nb == 5) {
TopoDS_Shape aLocalShape = DBRep::Get(arg[2],TopAbs_FACE);
TopoDS_Face plan = TopoDS::Face(aLocalShape);
// TopoDS_Face plan = TopoDS::Face(DBRep::Get(arg[2],TopAbs_FACE));
TopoDS_Shape geom1 = DBRep::Get(arg[3]);
TopoDS_Shape geom2 = DBRep::Get(arg[4]);
if (!plan.IsNull() && !geom1.IsNull() && !geom2.IsNull()) {
if (geom1.ShapeType() == TopAbs_VERTEX && geom2.ShapeType() == TopAbs_VERTEX) {
DIST = new DrawDim_PlanarDistance(TopoDS::Vertex(geom1),TopoDS::Vertex(geom2));
}
else if (geom1.ShapeType() == TopAbs_VERTEX && geom2.ShapeType() == TopAbs_EDGE) {
DIST = new DrawDim_PlanarDistance(TopoDS::Vertex(geom1),TopoDS::Edge(geom2));
}
else if (geom1.ShapeType() == TopAbs_EDGE && geom2.ShapeType() == TopAbs_EDGE) {
DIST = new DrawDim_PlanarDistance(TopoDS::Edge(geom1),TopoDS::Edge(geom2));
}
if (!DIST.IsNull()) {
Draw::Set(arg[1],DIST);
return 0;
}
}
}
}
di << "DrawDim_DISTANCE : error\n";
return 1;
}
//=======================================================================
//function : DrawDim_ANGLE
//purpose :
//=======================================================================
static Standard_Integer DrawDim_ANGLE (Draw_Interpretor& di,
Standard_Integer nb,
const char** arg)
{
if (nb == 1) {
di << "angle (name, profile[face],line1[edge],line2[edge])\n";
}
else {
Handle(DrawDim_PlanarAngle) DIST;
if (nb == 5) {
TopoDS_Shape aLocalShape = DBRep::Get(arg[2],TopAbs_FACE);
TopoDS_Face plan = TopoDS::Face(aLocalShape);
aLocalShape = DBRep::Get(arg[3],TopAbs_EDGE);
TopoDS_Edge line1 = TopoDS::Edge(aLocalShape);
aLocalShape = DBRep::Get(arg[4],TopAbs_EDGE);
TopoDS_Edge line2 = TopoDS::Edge(aLocalShape);
// TopoDS_Face plan = TopoDS::Face(DBRep::Get(arg[2],TopAbs_FACE));
// TopoDS_Edge line1 = TopoDS::Edge(DBRep::Get(arg[3],TopAbs_EDGE));
// TopoDS_Edge line2 = TopoDS::Edge(DBRep::Get(arg[4],TopAbs_EDGE));
if (!plan.IsNull() && !line1.IsNull() && !line2.IsNull()) {
DIST = new DrawDim_PlanarAngle(plan,line1,line2);
}
if (!DIST.IsNull()) {
Draw::Set(arg[1],DIST);
return 0;
}
}
}
di << "DrawDim_PlanarAngle : error\n";
return 1;
}
//=======================================================================
//function : DrawDim_RADIUS
//purpose :
//=======================================================================
static Standard_Integer DrawDim_RADIUS (Draw_Interpretor& di,
Standard_Integer nb,
const char** arg)
{
if (nb == 1) {
di << "radius (name, profile[face],cercle[edge])\n";
}
else {
Handle(DrawDim_PlanarRadius) DIST;
if (nb == 4) {
TopoDS_Shape aLocalShape = DBRep::Get(arg[2],TopAbs_FACE);
TopoDS_Face plan = TopoDS::Face(aLocalShape);
aLocalShape = DBRep::Get(arg[3],TopAbs_EDGE);
TopoDS_Edge cercle = TopoDS::Edge(aLocalShape);
// TopoDS_Face plan = TopoDS::Face(DBRep::Get(arg[2],TopAbs_FACE));
// TopoDS_Edge cercle = TopoDS::Edge(DBRep::Get(arg[3],TopAbs_EDGE));
if (!plan.IsNull() && !cercle.IsNull()) {
DIST = new DrawDim_PlanarRadius(cercle);
}
}
if (!DIST.IsNull()) {
Draw::Set(arg[1],DIST);
return 0;
}
}
di << "DrawDim_PlanarRadius : error\n";
return 1;
}
//=======================================================================
//function : DrawDim_CENTER
//purpose :
//=======================================================================
static Standard_Integer DrawDim_CENTER (Draw_Interpretor& di,
Standard_Integer nb,
const char** arg)
{
if (nb == 3) {
TopoDS_Shape aLocalShape = DBRep::Get(arg[2],TopAbs_EDGE);
TopoDS_Edge edge = TopoDS::Edge(aLocalShape);
// TopoDS_Edge edge = TopoDS::Edge(DBRep::Get(arg[2],TopAbs_EDGE));
Standard_Real f,l;
Handle(Geom_Curve) curve = BRep_Tool::Curve (edge,f,l);
if (curve->IsKind(STANDARD_TYPE(Geom_Circle))) {
gp_Circ circle = Handle(Geom_Circle)::DownCast(curve)->Circ();
gp_Pnt center = circle.Location ();
//:abv: avoid dependence on TKTopAlgo
TopoDS_Vertex vc;
// = BRepBuilderAPI_MakeVertex (center);
BRep_Builder B;
B.MakeVertex(vc,center,Precision::Confusion());
DBRep::Set(arg[1],vc);
return 0;
}
}
di << "DrawDim_CENTER : error\n";
return 1;
}
//=======================================================================
//function : DrawDim_VARIABLES
//purpose :
//=======================================================================
static Standard_Integer DrawDim_VARIABLES (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n != 2) return 1;
TopoDS_Shape aLocalShape = DBRep::Get(a[1],TopAbs_FACE);
TopoDS_Face F = TopoDS::Face(aLocalShape);
// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[1],TopAbs_FACE));
if (F.IsNull()) return 0;
Standard_Integer i = 0;
TopoDS_Vertex vf,vl;
TopTools_MapOfShape M;
M.Add(F);
TopExp_Explorer ex (F,TopAbs_EDGE);
while (ex.More()) {
if (M.Add(ex.Current())) {
TopExp::Vertices(TopoDS::Edge(ex.Current()),vf,vl);
if (M.Add(vf)) {
i++;
char* p = (char *)malloc(100);
Sprintf(p,"%s_%dv",a[1],i);
DBRep::Set(p,vf);
di.AppendElement(p);
DrawDim::DrawShapeName (vf,p);
}
if (M.Add(vl)) {
i++;
char *p = (char *)malloc(100);
Sprintf(p,"%s_%dv",a[1],i);
DBRep::Set(p,vl);
di.AppendElement(p);
DrawDim::DrawShapeName (vl,p);
}
i++;
char *p = (char *)malloc(100);
Sprintf(p,"%s_%de",a[1],i);
DBRep::Set(p,ex.Current());
di.AppendElement(p);
DrawDim::DrawShapeName (ex.Current(),p);
}
ex.Next();
}
return 0;
}
//=======================================================================
//function : DrawDim_SPLACEMENT
//purpose :
//=======================================================================
static Standard_Integer DrawDim_SPLACEMENT (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n == 4) {
TopoDS_Shape shape = DBRep::Get(a[1]);
TopoDS_Shape aLocalShape = DBRep::Get(a[2],TopAbs_FACE);
TopoDS_Face from = TopoDS::Face(aLocalShape);
aLocalShape = DBRep::Get(a[3],TopAbs_FACE);
TopoDS_Face to = TopoDS::Face(aLocalShape);
// TopoDS_Face from = TopoDS::Face(DBRep::Get(a[2],TopAbs_FACE));
// TopoDS_Face to = TopoDS::Face(DBRep::Get(a[3],TopAbs_FACE));
if (!shape.IsNull() && !from.IsNull() && !to.IsNull()) {
gp_Pln pfrom,pto;
DrawDim::Pln(from,pfrom);
DrawDim::Pln(to,pto);
gp_Ax3 axfrom (pfrom.Position());
gp_Ax3 axto (pto.Position());
gp_Trsf trsf;
trsf.SetDisplacement(axfrom,axto);
TopLoc_Location move (trsf);
shape.Move(move);
DBRep::Set(a[1],shape);
return 0;
}
}
di << "DrawDim_SPlacement : error\n";
return 1;
}
//=======================================================================
//function : DrawDim_GPLACEMENT
//purpose :
//=======================================================================
static Standard_Integer DrawDim_GPLACEMENT (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n == 4) {
Handle(Geom_Geometry) geom = DrawTrSurf::Get(a[1]);
TopoDS_Shape aLocalShape = DBRep::Get(a[2],TopAbs_FACE);
TopoDS_Face from = TopoDS::Face(aLocalShape);
aLocalShape = DBRep::Get(a[3],TopAbs_FACE);
TopoDS_Face to = TopoDS::Face(aLocalShape);
// TopoDS_Face from = TopoDS::Face(DBRep::Get(a[2],TopAbs_FACE));
// TopoDS_Face to = TopoDS::Face(DBRep::Get(a[3],TopAbs_FACE));
if (!geom.IsNull() && !from.IsNull() && !to.IsNull()) {
gp_Pln pfrom,pto;
DrawDim::Pln(from,pfrom);
DrawDim::Pln(to,pto);
gp_Ax3 axfrom (pfrom.Position());
gp_Ax3 axto (pto.Position());
gp_Trsf trsf;
trsf.SetDisplacement(axfrom,axto);
Handle(Geom_Geometry) newgeom = geom->Transformed(trsf);
DrawTrSurf::Set(a[1],newgeom);
return 0;
}
}
di << "DrawDim_Placement : error\n";
return 1;
}
//=======================================================================
//function : PlanarDimensionCommands
//purpose :
//=======================================================================
void DrawDim::PlanarDimensionCommands (Draw_Interpretor& theCommands)
{
// syntaxes
theCommands.Add ("distance",
"distance,no args to get help",
__FILE__, DrawDim_DISTANCE);
theCommands.Add ("radius",
"radius, no args to get help",
__FILE__, DrawDim_RADIUS);
theCommands.Add ("angle",
"angle, no args to get help",
__FILE__, DrawDim_ANGLE);
theCommands.Add ("center",
"to extract center of a circle : center ,name, circle",
__FILE__, DrawDim_CENTER);
theCommands.Add ("variables",
"to extract variables of a face",
__FILE__, DrawDim_VARIABLES);
theCommands.Add ("splacement",
"to move shape from face to face",
__FILE__, DrawDim_SPLACEMENT);
theCommands.Add ("gplacement",
"to move geometry from face to face",
__FILE__, DrawDim_GPLACEMENT);
}