01/12/2021
Как создать конус, направленный вдоль заданной оси
Вопрос: Как при помощи AutoCAD .NET API можно создать конус, который бы был направлен вдоль заданной пользователем оси?
Ответ: Для того, чтобы создать конус достаточно воспользоваться методом Solid3d.CreateFrustum. Созданный таким образом конус направлен вдоль оси Z, и начало координат находится в середине оси конуса. Дальше следует выполнить трансформацию конуса. Ниже исходный текст программы:
Код - C#: [Выделить]
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.Runtime;
- using System;
- // This line is not mandatory, but improves loading performances
- [assembly: CommandClass(typeof(CreateCone.ConeHandler))]
- namespace CreateCone
- {
- public class ConeHandler
- {
- [CommandMethod("CreateCone")]
- public void CreateConeHandler()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- Matrix3d ucsMat = ed.CurrentUserCoordinateSystem;
- PromptDistanceOptions prDistOpt =
- new PromptDistanceOptions("Укажите диаметр конуса");
- double radius = 0;
- PromptDoubleResult rsDist = ed.GetDistance(prDistOpt);
- if (rsDist.Status != PromptStatus.OK) return;
- radius = rsDist.Value;
- PromptPointOptions prPoint1 =
- new PromptPointOptions("Укажите точку центра основания конуса");
- PromptPointResult rsPoint1 = ed.GetPoint(prPoint1);
- if (rsPoint1.Status != PromptStatus.OK) return;
- Point3d p1 = rsPoint1.Value;
- PromptPointOptions prPoint2 =
- new PromptPointOptions("Укажите точку вершины конуса");
- prPoint2.UseBasePoint = true;
- prPoint2.BasePoint = p1;
- PromptPointResult rsPoint2 = ed.GetPoint(prPoint2);
- if (rsPoint2.Status != PromptStatus.OK) return;
- Point3d p2 = rsPoint2.Value;
- p1 = p1.TransformBy(ucsMat);
- p2 = p2.TransformBy(ucsMat);
- Vector3d vZnew = (p2 - p1).GetNormal();
- double height = p2.DistanceTo(p1);
- Matrix3d matTrans = Matrix3d.Displacement(Vector3d.ZAxis * 0.5 * height);
- // Вычисляем оси конуса
- Vector3d vXnew = vZnew.GetPerpendicularVector().GetNormal();
- Vector3d vYnew = vXnew.CrossProduct(vZnew).GetNormal();
- // Получаем матрицу выравнивания конуса вдоль заданной оси
- Matrix3d matAlign = Matrix3d.AlignCoordinateSystem(
- Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis,
- p1, vXnew, vYnew, vZnew);
- using (Transaction tr = doc.TransactionManager.StartOpenCloseTransaction() as Transaction)
- {
- BlockTableRecord btr = (BlockTableRecord)tr.GetObject(doc.Database.CurrentSpaceId, OpenMode.ForWrite);
- Solid3d sol = new Solid3d();
- sol.CreateFrustum(height, radius * 0.5, radius * 0.5, 0.0);
- sol.TransformBy(matTrans); // Переносим центр основания конуса в точку {0,0,0}
- sol.TransformBy(matAlign); // Трансформируем конус по матрице выравнивания
- btr.AppendEntity(sol);
- tr.AddNewlyCreatedDBObject(sol, true);
- tr.Commit();
- }
- }
- }
- }
Автор: Александр Ривилис
Опубликовано 01.12.2021
Опубликовано 01.12.2021