-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathSketcher_SnapLine.cxx
138 lines (124 loc) · 3.08 KB
/
Sketcher_SnapLine.cxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/**
* \file Sketcher_SnapLine.cxx
* \brief Implementation file for the class Sketcher_SnapLine
* \author <a href="mailto:sergmaslov@istel.ru?subject=Sketcher_SnapLine.cxx">Sergei Maslov</a>
*/
#include "Sketcher_SnapLine.hxx"
IMPLEMENT_STANDARD_RTTIEXT(Sketcher_SnapLine, Sketcher_Snap)
/**
* \fn Sketcher_SnapLine()
* \brief Constructs a Sketcher_SnapLine
* \return void
*/
Sketcher_SnapLine::Sketcher_SnapLine()
{
minAngle = 0;
curAngle = 0;
curDir2d = gp::DX2d();
tempDir2d= gp::DX2d();
tempGeom2d_Line = new Geom2d_Line(gp::Origin2d(),gp::DX2d());
}
/**
* \fn ~Sketcher_SnapLine()
* \brief Destructor
*/
Sketcher_SnapLine::~Sketcher_SnapLine()
{
}
/**
* \fn SelectNearest()
* \brief select nearest line
* \return void
*/
void Sketcher_SnapLine::SelectNearest()
{
findbestPnt2d = Standard_False;
minDistance = minimumSnapDistance/2;
for( Standard_Integer i=1; i<=data->Length(); i++)
{
mySObject = Handle(Sketcher_Object)::DownCast(data->Value(i));
myGeometryType = mySObject->GetGeometryType();
switch (myGeometryType)
{
case PointSketcherObject:
break;
case LineSketcherObject:
curGeom2d_Line = Handle(Geom2d_Line)::DownCast(mySObject->GetGeometry());
ProjectOnCurve.Init(curPnt2d,curGeom2d_Line);
if(countProject())
{
nearestPnt2d = objectPnt2d;
tempDir2d = curGeom2d_Line->Lin2d().Direction();
curHilightedObj = mySObject->GetAIS_Object();
mygp_Lin2 = ElCLib::To3d(curCoordinateSystem.Ax2(),curGeom2d_Line->Lin2d());
}
break;
case CircleSketcherObject:
case ArcSketcherObject:
break;
default:break;
}
}
}
/**
* \fn checkparallel()
* \brief check lines for parallel
* \return void
*/
void Sketcher_SnapLine::checkparallel()
{
if(curDir2d.IsParallel(tempDir2d,minAngle))
if (ProjectPoint())
{
mygp_Lin2 = ElCLib::To3d(curCoordinateSystem.Ax2(),curGeom2d_Line->Lin2d());
curAngle = curDir2d.Angle(tempDir2d);
if (minAngle > curAngle)
minAngle = curAngle;
else minAngle = M_PI - curAngle;
}
}
/**
* \fn ProjectPoint()
* \brief find point projected to line
* \return Standard_Boolean
*/
Standard_Boolean Sketcher_SnapLine::ProjectPoint()
{
tempGeom2d_Line->SetLocation(curGeom2d_Point->Pnt2d());
tempGeom2d_Line->SetDirection(tempDir2d);
ProjectOnCurve.Init(nearestPnt2d,tempGeom2d_Line);
if(ProjectOnCurve.NbPoints() > 0)
{
mygp_Lin1 = ElCLib::To3d(curCoordinateSystem.Ax2(),tempGeom2d_Line->Lin2d());
bestPnt2d = ProjectOnCurve.NearestPoint();
return Standard_True;
}
return Standard_False;
}
/**
* \fn ProjectPoint()
* \brief set Edges to display relation
* \return Standard_Boolean
*/
void Sketcher_SnapLine::setEdges()
{
findbestPnt2d = Standard_True;
BRepBuilderAPI_MakeEdge me1 (mygp_Lin1);
BRepBuilderAPI_MakeEdge me2 (mygp_Lin2);
if (me1.IsDone () && me2.IsDone () )
{
FirstEdge = me1.Edge();
SecondEdge = me2.Edge();
}
minDistance = bestPnt2d.Distance(curPnt2d);
}
/**
* \fn setFirstPnt(const gp_Pnt2d& p)
* \brief set point for exceptions
* \return void
* \param p const gp_Pnt2d&
*/
void Sketcher_SnapLine::setFirstPnt(const gp_Pnt2d& p)
{
curGeom2d_Point->SetPnt2d(p);
}