Добрый день!
Есть задача, стены строятся из файла точек с помощью процедуры
private void CreateWalls() {
for (int i = 0; i < points.Count; i++) {
if (i % 2 == 1) {
using (Transaction tr = new Transaction(_doc, "Create wall")) {
tr.Start();
string[] start = points[i - 1].Split(' ');
string[] end = points[i].Split(' ');
Line geomLine = Line.CreateBound(new XYZ(double.Parse(start[0].Split('=')[1]),
double.Parse(start[1].Split('=')[1]),
0) / Consts.scale,
new XYZ(double.Parse(end[0].Split('=')[1]),
double.Parse(end[1].Split('=')[1]),
0) / Consts.scale);
walls.Add(Wall.Create(_doc, geomLine, _level.Id, true));
richTextBox1.Text += "Wall created...\n";
tr.Commit();
}
}
}
UIDocument uidoc = new UIDocument(_doc);
UIView uiview = uidoc.GetOpenUIViews().Cast<UIView>().First(q => q.ViewId == _doc.ActiveView.Id);
uidoc.RefreshActiveView();
uiview.ZoomToFit();
}
Все замечательно с помощью RevitLookup просматриваю элементы, все стены создаются.
Затем из другого файла беру точку (я знаю что это точка находится на линии, по которой создавалась стена) и пытаюсь с помощью мат фунции по принадлежности точки отрезку заданным двумя точками (уравнение прямой) определить лежит ли точка на прямой стены.
string[] insertion = points[0].Split(' ');
XYZ insert = new XYZ(double.Parse(insertion[0].Split('=')[1]),
double.Parse(insertion[1].Split('=')[1]),
double.Parse(insertion[2].Split('=')[1]));
foreach (Wall wall in walls) {
XYZ start = (wall.Location as LocationCurve).Curve.GetEndPoint(0);
XYZ end = (wall.Location as LocationCurve).Curve.GetEndPoint(1);
start = start * Consts.scale;
end = end * Consts.scale;
WallType wt = wall.WallType;
double y3 = a * insert.X + b;
double b1 = insert.X - start.X;
double b2 = end.Y - start.Y;
double b3 = end.X - start.X;
double b4 = insert.Y - start.Y;
double r = b1 * b2 - b3 * b4;
Но равенство не выполняется, недоумеваю почему, есть подозрение что изза системы координат, но не могу быть уверенным. Но опять же используя RevitLookup я вижу верные координаты по которым изначально создавалась стена.
Простая проверка: беру начальну точку стены и строю новую стену со второй координатой в роли этой точки - стены накладываются друг на друга.
Вторая идея была построить сферу с необходимым радиусом и искать пересечение со стеной:
static public Solid CreateSphereAt(CreationApp creapp, XYZ centre, double radius )
{
Frame frame = new Frame( centre,
XYZ.BasisX, XYZ.BasisY, XYZ.BasisZ );
Arc arc = creapp.NewArc(
centre - radius * XYZ.BasisZ,
centre + radius * XYZ.BasisZ,
centre + radius * XYZ.BasisX );
Line line = creapp.NewLineBound(
arc.get_EndPoint( 1 ),
arc.get_EndPoint( 0 ) );
CurveLoop halfCircle = new CurveLoop();
halfCircle.Append( arc );
halfCircle.Append( line );
List<CurveLoop> loops = new List<CurveLoop>( 1 );
loops.Add( halfCircle );
return GeometryCreationUtilities
.CreateRevolvedGeometry(
frame, loops, 0, 2 * Math.PI );
}
Но в Revit 2015 нет функции NewArc.
Есть еще какие-нибудь варианты или решения для данной задачи?
Спасибо