mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-05 18:16:23 +03:00
462 lines
16 KiB
C++
462 lines
16 KiB
C++
// Created on: 1993-07-22
|
|
// Created by: Remi LEQUETTE
|
|
// Copyright (c) 1993-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 <BRepTest.hxx>
|
|
#include <DBRep.hxx>
|
|
#include <Draw_Interpretor.hxx>
|
|
#include <Draw_Appli.hxx>
|
|
#include <DrawTrSurf.hxx>
|
|
#include <BRepBuilderAPI.hxx>
|
|
#include <BRepPreviewAPI_MakeBox.hxx>
|
|
#include <BRepPrimAPI_MakeBox.hxx>
|
|
#include <BRepPrimAPI_MakeWedge.hxx>
|
|
#include <BRepPrimAPI_MakeCylinder.hxx>
|
|
#include <BRepPrimAPI_MakeCone.hxx>
|
|
#include <BRepPrimAPI_MakeTorus.hxx>
|
|
#include <BRepPrimAPI_MakeSphere.hxx>
|
|
#include <Geom_Plane.hxx>
|
|
#include <gp_Pln.hxx>
|
|
#include <Message.hxx>
|
|
|
|
//=======================================================================
|
|
// box
|
|
//=======================================================================
|
|
|
|
static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char** a)
|
|
{
|
|
gp_Pnt anOrigin;
|
|
gp_XYZ aParams;
|
|
gp_Dir aDir;
|
|
gp_Dir aXDir;
|
|
Standard_Boolean isMinMax = Standard_False;
|
|
Standard_Boolean isPreview = Standard_False;
|
|
Standard_Boolean isAxis = Standard_False;
|
|
|
|
for (Standard_Integer anArgIter = 2; anArgIter < n; ++anArgIter)
|
|
{
|
|
TCollection_AsciiString anArgCase (a[anArgIter]);
|
|
anArgCase.LowerCase();
|
|
if (anArgCase == "-min" && anArgIter + 3 <= n)
|
|
{
|
|
anOrigin.SetX (Draw::Atof(a[anArgIter + 1]));
|
|
anOrigin.SetY (Draw::Atof(a[anArgIter + 2]));
|
|
anOrigin.SetZ (Draw::Atof(a[anArgIter + 3]));
|
|
anArgIter += 3;
|
|
}
|
|
else if (anArgCase == "-max" && anArgIter + 3 <= n)
|
|
{
|
|
aParams.SetX (Draw::Atof(a[anArgIter + 1]));
|
|
aParams.SetY (Draw::Atof(a[anArgIter + 2]));
|
|
aParams.SetZ (Draw::Atof(a[anArgIter + 3]));
|
|
isMinMax = Standard_True;
|
|
anArgIter += 3;
|
|
}
|
|
else if (anArgCase == "-size" && anArgIter + 3 <= n)
|
|
{
|
|
aParams.SetX (Draw::Atof(a[anArgIter + 1]));
|
|
aParams.SetY (Draw::Atof(a[anArgIter + 2]));
|
|
aParams.SetZ (Draw::Atof(a[anArgIter + 3]));
|
|
isMinMax = Standard_False;
|
|
anArgIter += 3;
|
|
}
|
|
else if (anArgCase == "-dir" && anArgIter + 3 <= n)
|
|
{
|
|
Standard_Real aX = Draw::Atof(a[anArgIter + 1]);
|
|
Standard_Real anY = Draw::Atof(a[anArgIter + 2]);
|
|
Standard_Real aZ = Draw::Atof(a[anArgIter + 3]);
|
|
aDir.SetCoord (aX, anY, aZ);
|
|
isAxis = Standard_True;
|
|
anArgIter += 3;
|
|
}
|
|
else if (anArgCase == "-xdir" && anArgIter + 3 <= n)
|
|
{
|
|
Standard_Real aX = Draw::Atof(a[anArgIter + 1]);
|
|
Standard_Real anY = Draw::Atof(a[anArgIter + 2]);
|
|
Standard_Real aZ = Draw::Atof(a[anArgIter + 3]);
|
|
aXDir.SetCoord (aX, anY, aZ);
|
|
isAxis = Standard_True;
|
|
anArgIter += 3;
|
|
}
|
|
else if (anArgCase == "-preview")
|
|
{
|
|
isPreview = Standard_True;
|
|
}
|
|
else if (anArgIter + 5 < n || anArgIter + 2 < n)
|
|
{
|
|
Standard_Real aValue = 0.0;
|
|
Standard_Integer aCountReal = 0;
|
|
Standard_Integer anIter = anArgIter;
|
|
while (anIter < n && Draw::ParseReal(a[anIter], aValue))
|
|
{
|
|
anIter++;
|
|
aCountReal++;
|
|
}
|
|
|
|
if (aCountReal == 6)
|
|
{
|
|
anOrigin.SetX (Draw::Atof(a[anArgIter]));
|
|
anOrigin.SetY (Draw::Atof(a[anArgIter + 1]));
|
|
anOrigin.SetZ (Draw::Atof(a[anArgIter + 2]));
|
|
|
|
aParams.SetX (Draw::Atof(a[anArgIter + 3]));
|
|
aParams.SetY (Draw::Atof(a[anArgIter + 4]));
|
|
aParams.SetZ (Draw::Atof(a[anArgIter + 5]));
|
|
anArgIter += 5;
|
|
}
|
|
|
|
else if (aCountReal == 3)
|
|
{
|
|
aParams.SetX (Draw::Atof(a[anArgIter]));
|
|
aParams.SetY (Draw::Atof(a[anArgIter + 1]));
|
|
aParams.SetZ (Draw::Atof(a[anArgIter + 2]));
|
|
anArgIter += 2;
|
|
}
|
|
else
|
|
{
|
|
Message::SendFail() << "Syntax error";
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (isPreview)
|
|
{
|
|
TopoDS_Shape S;
|
|
BRepPreviewAPI_MakeBox aPreview;
|
|
|
|
if (isMinMax == Standard_True)
|
|
{
|
|
aPreview.Init (anOrigin, aParams);
|
|
}
|
|
else if (isMinMax == Standard_False && isAxis == Standard_False)
|
|
{
|
|
aPreview.Init (anOrigin, aParams.X(), aParams.Y(), aParams.Z());
|
|
}
|
|
else if (isAxis)
|
|
{
|
|
gp_Ax2 anAxis (anOrigin, aDir, aXDir);
|
|
aPreview.Init (anAxis, aParams.X(), aParams.Y(), aParams.Z());
|
|
}
|
|
else
|
|
{
|
|
aPreview.Init (aParams.X(), aParams.Y(), aParams.Z());
|
|
}
|
|
|
|
S = aPreview;
|
|
DBRep::Set(a[1],S);
|
|
}
|
|
else
|
|
{
|
|
TopoDS_Solid S;
|
|
if (isMinMax == Standard_True)
|
|
{
|
|
S = BRepPrimAPI_MakeBox(anOrigin, aParams);
|
|
}
|
|
else if (isMinMax == Standard_False && isAxis == Standard_False)
|
|
{
|
|
S = BRepPrimAPI_MakeBox(anOrigin, aParams.X(), aParams.Y(), aParams.Z());
|
|
}
|
|
else if (isAxis)
|
|
{
|
|
gp_Ax2 anAxis (anOrigin, aDir, aXDir);
|
|
S = BRepPrimAPI_MakeBox(anAxis, aParams.X(), aParams.Y(), aParams.Z());
|
|
}
|
|
else
|
|
{
|
|
S = BRepPrimAPI_MakeBox(aParams.X(), aParams.Y(), aParams.Z());
|
|
}
|
|
DBRep::Set(a[1],S);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
// wedge
|
|
//=======================================================================
|
|
|
|
static Standard_Integer wedge(Draw_Interpretor& , Standard_Integer n, const char** a)
|
|
{
|
|
TopoDS_Solid S;
|
|
|
|
// Standard_Integer i = 0;
|
|
if ( n == 15 || n == 18) {
|
|
gp_Pnt LocalP(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]));
|
|
gp_Dir LocalN(Draw::Atof(a[5]),Draw::Atof(a[6]),Draw::Atof(a[7]));
|
|
gp_Dir LocalVx(Draw::Atof(a[8]),Draw::Atof(a[9]),Draw::Atof(a[10]));
|
|
gp_Ax2 Axis(LocalP,LocalN,LocalVx);
|
|
// gp_Ax2 Axis(gp_Pnt(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4])),
|
|
// gp_Dir(Draw::Atof(a[5]),Draw::Atof(a[6]),Draw::Atof(a[7])),
|
|
// gp_Dir(Draw::Atof(a[8]),Draw::Atof(a[9]),Draw::Atof(a[10])));
|
|
if ( n == 15) {
|
|
S = BRepPrimAPI_MakeWedge(Axis,
|
|
Draw::Atof(a[11]),Draw::Atof(a[12]),Draw::Atof(a[13]),Draw::Atof(a[14]));
|
|
}
|
|
else {
|
|
S = BRepPrimAPI_MakeWedge(Axis,
|
|
Draw::Atof(a[11]),Draw::Atof(a[12]),Draw::Atof(a[13]),
|
|
Draw::Atof(a[14]),Draw::Atof(a[15]),Draw::Atof(a[16]),Draw::Atof(a[17]));
|
|
}
|
|
}
|
|
else if (n == 6) {
|
|
S = BRepPrimAPI_MakeWedge(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]));
|
|
}
|
|
else if (n == 9){
|
|
S = BRepPrimAPI_MakeWedge(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]),
|
|
Draw::Atof(a[5]),Draw::Atof(a[6]),Draw::Atof(a[7]),Draw::Atof(a[8]));
|
|
}
|
|
else
|
|
return 1;
|
|
|
|
DBRep::Set(a[1],S);
|
|
return 0;
|
|
}
|
|
|
|
//=======================================================================
|
|
// cylinder
|
|
//=======================================================================
|
|
|
|
static Standard_Integer cylinder(Draw_Interpretor& , Standard_Integer n, const char** a)
|
|
{
|
|
if (n < 3) return 1;
|
|
TopoDS_Solid S;
|
|
Handle(Geom_Plane) P =
|
|
Handle(Geom_Plane)::DownCast(DrawTrSurf::Get(a[2]));
|
|
|
|
if (n == 4) {
|
|
S = BRepPrimAPI_MakeCylinder(Draw::Atof(a[2]),Draw::Atof(a[3]));
|
|
}
|
|
else if (n == 5) {
|
|
if (P.IsNull())
|
|
S = BRepPrimAPI_MakeCylinder(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0));
|
|
else
|
|
S = BRepPrimAPI_MakeCylinder(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]));
|
|
}
|
|
else if (n == 6) {
|
|
if (P.IsNull())
|
|
return 1;
|
|
else
|
|
S = BRepPrimAPI_MakeCylinder(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]) * (M_PI / 180.0));
|
|
}
|
|
else
|
|
return 1;
|
|
|
|
DBRep::Set(a[1],S);
|
|
return 0;
|
|
}
|
|
|
|
//=======================================================================
|
|
// cone
|
|
//=======================================================================
|
|
|
|
static Standard_Integer cone(Draw_Interpretor& , Standard_Integer n, const char** a)
|
|
{
|
|
if (n < 3) return 1;
|
|
TopoDS_Solid S;
|
|
|
|
Handle(Geom_Plane) P =
|
|
Handle(Geom_Plane)::DownCast(DrawTrSurf::Get(a[2]));
|
|
|
|
if (n == 5) {
|
|
S = BRepPrimAPI_MakeCone(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]));
|
|
}
|
|
else if (n == 6) {
|
|
if (P.IsNull())
|
|
S = BRepPrimAPI_MakeCone(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]) * (M_PI / 180.0));
|
|
else
|
|
S = BRepPrimAPI_MakeCone(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]));
|
|
}
|
|
else if (n == 7) {
|
|
S = BRepPrimAPI_MakeCone(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]),Draw::Atof(a[6]) * (M_PI / 180.0));
|
|
}
|
|
else
|
|
return 1;
|
|
|
|
DBRep::Set(a[1],S);
|
|
return 0;
|
|
}
|
|
|
|
//=======================================================================
|
|
// sphere
|
|
//=======================================================================
|
|
|
|
static Standard_Integer sphere(Draw_Interpretor& , Standard_Integer n, const char** a)
|
|
{
|
|
if (n < 3) return 1;
|
|
TopoDS_Solid S;
|
|
|
|
Handle(Geom_Plane) P =
|
|
Handle(Geom_Plane)::DownCast(DrawTrSurf::Get(a[2]));
|
|
|
|
if (n == 3) {
|
|
S = BRepPrimAPI_MakeSphere(Draw::Atof(a[2]));
|
|
}
|
|
else if (n == 4) {
|
|
if (P.IsNull())
|
|
S = BRepPrimAPI_MakeSphere(Draw::Atof(a[2]),Draw::Atof(a[3]) * (M_PI / 180.0));
|
|
else
|
|
S = BRepPrimAPI_MakeSphere(P->Pln().Position().Ax2(),Draw::Atof(a[3]));
|
|
}
|
|
else if (n == 5) {
|
|
if (P.IsNull())
|
|
S = BRepPrimAPI_MakeSphere(Draw::Atof(a[2]),Draw::Atof(a[3]) * (M_PI / 180.0),Draw::Atof(a[4]) * (M_PI / 180.0));
|
|
else
|
|
S = BRepPrimAPI_MakeSphere(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0));
|
|
}
|
|
else if (n == 6) {
|
|
if (P.IsNull())
|
|
S = BRepPrimAPI_MakeSphere(Draw::Atof(a[2]),Draw::Atof(a[3]) * (M_PI / 180.0),Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0));
|
|
else
|
|
S = BRepPrimAPI_MakeSphere(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0));
|
|
}
|
|
else if (n == 7) {
|
|
S = BRepPrimAPI_MakeSphere(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0),Draw::Atof(a[6]) * (M_PI / 180.0));
|
|
}
|
|
else
|
|
return 1;
|
|
|
|
DBRep::Set(a[1],S);
|
|
return 0;
|
|
}
|
|
|
|
//=======================================================================
|
|
// torus
|
|
//=======================================================================
|
|
|
|
static Standard_Integer torus(Draw_Interpretor& , Standard_Integer n, const char** a)
|
|
{
|
|
if (n < 3) return 1;
|
|
TopoDS_Solid S;
|
|
|
|
Handle(Geom_Plane) P =
|
|
Handle(Geom_Plane)::DownCast(DrawTrSurf::Get(a[2]));
|
|
|
|
if (n == 4) {
|
|
S = BRepPrimAPI_MakeTorus(Draw::Atof(a[2]),Draw::Atof(a[3]));
|
|
}
|
|
else if (n == 5) {
|
|
if (P.IsNull())
|
|
S = BRepPrimAPI_MakeTorus(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0));
|
|
else
|
|
S = BRepPrimAPI_MakeTorus(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]));
|
|
}
|
|
else if (n == 6) {
|
|
if (P.IsNull())
|
|
S = BRepPrimAPI_MakeTorus(Draw::Atof(a[2]),Draw::Atof(a[3]),
|
|
Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0));
|
|
else
|
|
S = BRepPrimAPI_MakeTorus(P->Pln().Position().Ax2(),
|
|
Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]) * (M_PI / 180.0));
|
|
}
|
|
else if (n == 7) {
|
|
if (P.IsNull())
|
|
S = BRepPrimAPI_MakeTorus(Draw::Atof(a[2]),Draw::Atof(a[3]),
|
|
Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0),Draw::Atof(a[6]) * (M_PI / 180.0));
|
|
else
|
|
S = BRepPrimAPI_MakeTorus(P->Pln().Position().Ax2(),Draw::Atof(a[3]),
|
|
Draw::Atof(a[4]),Draw::Atof(a[5]) * (M_PI / 180.0),Draw::Atof(a[6]) * (M_PI / 180.0));
|
|
}
|
|
else if (n == 8) {
|
|
S = BRepPrimAPI_MakeTorus(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]),
|
|
Draw::Atof(a[5]) * (M_PI / 180.0),Draw::Atof(a[6]) * (M_PI / 180.0),Draw::Atof(a[7]) * (M_PI / 180.0));
|
|
}
|
|
else
|
|
return 1;
|
|
|
|
DBRep::Set(a[1],S);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
//function : PrimitiveCommands
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void BRepTest::PrimitiveCommands(Draw_Interpretor& theCommands)
|
|
{
|
|
static Standard_Boolean done = Standard_False;
|
|
if (done) return;
|
|
done = Standard_True;
|
|
|
|
DBRep::BasicCommands(theCommands);
|
|
|
|
const char* g = "Primitive building commands";
|
|
|
|
theCommands.Add ("box",
|
|
"box name [dx dy dz] [x y z dx dy dz]"
|
|
"\n\t\t: [-min x y z] [-size dx dy dz] [-max x y z]"
|
|
"\n\t\t: [-dir x y z -xdir x y z] [-preview]"
|
|
"\n\t\t: Construct axes-aligned box and put result into 'name' variable"
|
|
"\n\t\t: -min box lower corner, origin; (0,0,0) by default"
|
|
"\n\t\t: -size box dimensions (alternative to -max)"
|
|
"\n\t\t: -max box upper corner (alternative to -size)"
|
|
"\n\t\t: -dir main direction of coordinate system (DZ by default)"
|
|
"\n\t\t: -xdir x direction of coordinate system (DX by default)"
|
|
"\n\t\t: -preview non-solid shape will be created (vertex, edge, rectangle or box);"
|
|
"\n\t\t: otherwise, return NULL shape in case of zero box dimension.",
|
|
__FILE__,box,g);
|
|
|
|
theCommands.Add("wedge","wedge name [Ox Oy Oz Zx Zy Zz Xx Xy Xz] dx dy dz ltx / xmin zmin xmax zmax",__FILE__,wedge,g);
|
|
|
|
theCommands.Add("pcylinder",
|
|
"pcylinder name [plane(ax2)] R H [angle]"
|
|
"\n\t\t: Construct a cylinder and put result into 'name' variable."
|
|
"\n\t\t: Parameters of the cylinder :"
|
|
"\n\t\t: - plane coordinate system for the construction of the cylinder"
|
|
"\n\t\t: - R cylinder radius"
|
|
"\n\t\t: - H cylinder height"
|
|
"\n\t\t: - angle cylinder top radius",
|
|
__FILE__, cylinder, g);
|
|
|
|
theCommands.Add("pcone",
|
|
"pcone name [plane(ax2)] R1 R2 H [angle]"
|
|
"\n\t\t: Construct a cone, part cone or conical frustum and put result into 'name' variable."
|
|
"\n\t\t: Parameters of the cone :"
|
|
"\n\t\t: - plane coordinate system for the construction of the cone"
|
|
"\n\t\t: - R1 cone bottom radius"
|
|
"\n\t\t: - R2 cone top radius"
|
|
"\n\t\t: - H cone height"
|
|
"\n\t\t: - angle angle to create a part cone",
|
|
__FILE__, cone, g);
|
|
|
|
theCommands.Add("psphere",
|
|
"psphere name [plane(ax2)] R [angle1 angle2] [angle]"
|
|
"\n\t\t: Construct a sphere, spherical segment or spherical wedge and put result into 'name' variable."
|
|
"\n\t\t: Parameters of the sphere :"
|
|
"\n\t\t: - plane coordinate system for the construction of the sphere"
|
|
"\n\t\t: - R sphere radius"
|
|
"\n\t\t: - angle1 first angle to create a spherical segment [-90; 90]"
|
|
"\n\t\t: - angle2 second angle to create a spherical segment [-90; 90]"
|
|
"\n\t\t: - angle angle to create a spherical wedge",
|
|
__FILE__, sphere, g);
|
|
|
|
theCommands.Add("ptorus",
|
|
"ptorus name [plane(ax2)] R1 R2 [angle1 angle2] [angle]"
|
|
"\n\t\t: Construct a torus or torus segment and put result into 'name' variable."
|
|
"\n\t\t: Parameters of the torus :"
|
|
"\n\t\t: - plane coordinate system for the construction of the torus"
|
|
"\n\t\t: - R1 distance from the center of the pipe to the center of the torus"
|
|
"\n\t\t: - R2 radius of the pipe"
|
|
"\n\t\t: - angle1 first angle to create a torus ring segment"
|
|
"\n\t\t: - angle2 second angle to create a torus ring segment"
|
|
"\n\t\t: - angle angle to create a torus pipe segment",
|
|
__FILE__, torus, g);
|
|
}
|
|
|
|
|