29/06/2017
Как установить ось Z ПСК вдоль линии в .NET
Вопрос: Имеются различные линии в AutoCAD (отрезки, полилинии, сплайны). Как можно установить ось Z текущей ПСК вдоль линии в указанной пользователем точке?
Ответ: Ниже приведён код, который позволяет установить ось Z ПСК вдоль выбранной пользователем линии. В качестве начала координат ПСК выбирается точка на линии, ближайшая к указанной пользователем точке:
Код - C#: [Выделить]
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- #pragma warning disable 0618
- [assembly: CommandClass(typeof(SetUcsWithLine.MyCommands))]
- namespace SetUcsWithLine
- {
- public class MyCommands
- {
- [CommandMethod("SetUcsWithLine")]
- public void SetUcsWithLineFunc()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- // Запрашиваем у пользователя линию, вдоль которой будет направлена ось Z ПСК
- PromptEntityOptions peOpts = new PromptEntityOptions("Выберите линию:");
- peOpts.SetRejectMessage("Это не линия");
- peOpts.AddAllowedClass(typeof(Curve), false);
- PromptEntityResult peRs = ed.GetEntity(peOpts);
- if (peRs.Status != PromptStatus.OK) return;
- // Точка начала координат в указанной пользователем точке
- Point3d ptOrig = peRs.PickedPoint.TransformBy(ed.CurrentUserCoordinateSystem);
- Vector3d zAxis = GetTangenVectorOfCurve(peRs.ObjectId, ref ptOrig).GetNormal();
- Vector3d xAxis = zAxis.GetPerpendicularVector().GetNormal();
- Vector3d yAxis = xAxis.RotateBy(Math.PI * 0.5, zAxis);
- Matrix3d mat =
- Matrix3d.AlignCoordinateSystem(Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis,
- ptOrig, xAxis, yAxis, zAxis);
- // Устанавливаем новую ПСК
- ed.CurrentUserCoordinateSystem = mat;
- ed.Regen();
- }
- /// <summary>
- /// Получение вектора вдоль линии, указанной её ObjectId и точкой на линии
- /// Функция уточняет точку на линии, находя ближайшую к ней в проекции взгляда
- /// </summary>
- /// <param name="id"></param>
- /// <param name="pt"></param>
- /// <returns></returns>
- public Vector3d GetTangenVectorOfCurve(ObjectId id, ref Point3d pt)
- {
- Vector3d v = Vector3d.ZAxis;
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- using (Curve cv = id.Open(OpenMode.ForRead) as Curve) {
- Vector3d viewDir = ((Point3d)Application.GetSystemVariable("VIEWDIR")).GetAsVector();
- viewDir.TransformBy(ed.CurrentUserCoordinateSystem);
- pt = cv.GetClosestPointTo(pt, viewDir, false);
- v = cv.GetFirstDerivative(pt);
- }
- return v;
- }
- }
- }
Автор: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7899
Опубликовано 29.06.2017