26/10/2013
Выравнивание примитива по трем точкам
Ниже приведен пример кода, который выравнивает выбранный примитив по трем базовым и трем целевым точкам. Порядок, в котором точки выбираются, показан на картинке. Приведен пример чертежа для проверки кода.
Код - C#: [Выделить]
- Document activeDoc = Application.DocumentManager.MdiActiveDocument;
- Database db = activeDoc.Database;
- Editor ed = activeDoc.Editor;
- // Запрос выбора примитива
- PromptEntityResult per
- = ed.GetEntity(new PromptEntityOptions("Выберите примитив : "));
- if (per.Status != PromptStatus.OK)
- return;
- ObjectId oid = per.ObjectId;
- Matrix3d ucs2wcs = ed.CurrentUserCoordinateSystem;
- // Три исходных точки
- Point3d srcpt1 = Point3d.Origin;
- Point3d srcpt2 = Point3d.Origin;
- Point3d srcpt3 = Point3d.Origin;
- // Три целевых точки
- Point3d destpt1 = Point3d.Origin;
- Point3d destpt2 = Point3d.Origin;
- Point3d destpt3 = Point3d.Origin;
- // Исходная точка 1
- PromptPointResult ppr1
- = ed.GetPoint(new PromptPointOptions("Первая исходная точка"));
- if (ppr1.Status != PromptStatus.OK)
- return;
- srcpt1 = ppr1.Value.TransformBy(ucs2wcs);
- // Целевая точка 1
- ppr1 = ed.GetPoint(new PromptPointOptions("Первая целевая точка"));
- if (ppr1.Status != PromptStatus.OK)
- return;
- destpt1 = ppr1.Value.TransformBy(ucs2wcs);
- // Показываем временную линию для выбранных точек
- IntegerCollection coll = new IntegerCollection();
- Line tmpline1 = new Line(srcpt1, destpt1);
- TransientManager.CurrentTransientManager.AddTransient
- (tmpline1, TransientDrawingMode.DirectShortTerm, 128, coll);
- // Исходная точка 2
- PromptPointResult ppr2
- = ed.GetPoint(new PromptPointOptions("Вторая исходная точка"));
- if (ppr2.Status != PromptStatus.OK)
- return;
- srcpt2 = ppr2.Value.TransformBy(ucs2wcs);
- // Целевая точка 2
- ppr2 = ed.GetPoint(new PromptPointOptions("Вторая целевая точка"));
- if (ppr2.Status != PromptStatus.OK)
- return;
- destpt2 = ppr2.Value.TransformBy(ucs2wcs);
- // Показываем временную линию для выбранных точек
- Line tmpline2 = new Line(srcpt2, destpt2);
- TransientManager.CurrentTransientManager.AddTransient
- (tmpline2, TransientDrawingMode.DirectShortTerm, 128, coll);
- // Исходная точка 3
- PromptPointResult ppr3
- = ed.GetPoint(new PromptPointOptions("Третья исходная точка"));
- if (ppr3.Status != PromptStatus.OK)
- return;
- srcpt3 = ppr3.Value.TransformBy(ucs2wcs);
- // Целевая точка 3
- ppr3 = ed.GetPoint(new PromptPointOptions("Третья целевая точка"));
- if (ppr3.Status != PromptStatus.OK)
- return;
- destpt3 = ppr3.Value.TransformBy(ucs2wcs);
- // Показываем временную линию для выбранных точек
- Line tmpline3 = new Line(srcpt3, destpt3);
- TransientManager.CurrentTransientManager.AddTransient
- (tmpline3, TransientDrawingMode.DirectShortTerm, 128, coll);
- try
- {
- Point3d fromOrigin = srcpt1;
- Vector3d fromXaxis = srcpt2 - srcpt1;
- Vector3d fromYaxis = srcpt3 - srcpt1;
- Vector3d fromZaxis = fromXaxis.CrossProduct(fromYaxis);
- Point3d toOrigin = destpt1;
- Vector3d toXaxis =
- (destpt2 - destpt1).GetNormal() * fromXaxis.Length;
- Vector3d toYaxis
- = (destpt3 - destpt1).GetNormal() * fromYaxis.Length;
- Vector3d toZaxis = toXaxis.CrossProduct(toYaxis);
- // Получаем матрицу преобразования в новую систему координат
- Matrix3d mat = new Matrix3d();
- mat = Matrix3d.AlignCoordinateSystem(
- fromOrigin,
- fromXaxis,
- fromYaxis,
- fromZaxis,
- toOrigin,
- toXaxis,
- toYaxis,
- toZaxis);
- // Преобразуем (выравниваем) выбранный примитив
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- Entity ent = tr.GetObject(oid, OpenMode.ForWrite) as Entity;
- ent.TransformBy(mat);
- tr.Commit();
- }
- }
- catch (Autodesk.AutoCAD.Runtime.Exception ex )
- {
- ed.WriteMessage(ex.Message);
- }
- // Удаляем временные линии
- TransientManager.CurrentTransientManager.EraseTransient (tmpline1, coll);
- tmpline1.Dispose();
- TransientManager.CurrentTransientManager.EraseTransient (tmpline2, coll);
- tmpline2.Dispose();
- TransientManager.CurrentTransientManager.EraseTransient (tmpline3, coll);
- tmpline3.Dispose();
Рисунки показывают в каком порядке выбирались точки и повернутый примитив
А это чертеж для примера: Загрузите тестовый файл
Источник: http://adndevblog.typepad.com/autocad/2013/07/aligning-entity-using-3-points.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=287
Опубликовано 26.10.2013