Редактирование полилиний
2D- и 3D-полилинии, прямоугольники, многоугольники, кольца являются разновидностями полилиний и редактируются с использованием сходных подходов.
Примечание: в оригинальном тексте сказано также и про "3D polygon meshes", я не понял, как PolufaceMesh может редактироваться аналогично полилинии и не стал это включать.
Полилинии также можно задать сглаживание, которое может быть двух типов -- круговыми дугами или одной из двух форм сплайновой кривой (B-сплайн): квадратичным или кубическим сплайном.
Для редактирования полилинии используйте свойства и методы объекта Polyline, Polyline2d или Polyline3d в зависимости от того, каким классом описывается данный объект в чертеже. Используйте следующие свойства и методы, чтобы замкнуть\разомкнуть полилинию, изменить координаты отдельной вершины или добавить новую вершину:
- Свойство Closed : возвращает или задает замкнутость полилинии;
- Свойство ConstantWidth : возвращает или задает постоянную ширины плоской полилинии;
- Метод AppendVertex : добавляет новую вершину для плоской или пространственной полилинии;
- Метод AddVertexAt : задает значение вершины в заданной точке кривой;
- Метод ReverseCurve : обращает направление кривой;
- Метод SetBulgeAt : задает величину выпуклости для данного сегмента кривой;
- Метод SetStartWidthAt : задет ширину в начале сегмента кривой;
- Метод Straighten : удаляет из полилинии все вершины сплайна и аппроксимирующей кривой и определяет все оставшиеся вершины в качестве простых вершин. Эта операция эквивалентна команде PEDIT с опцией "Decurve"
В примере ниже создается плоская полилиния. Затем третьему сегменту полилинии задается выпуклость = :0.5, к полилинии добавляется вершина, изменяется ширина последнего сегмента и, наконец, полилиния замыкается.
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[CommandMethod("EditPolyline")]
public static void EditPolyline()
{
// Get the current document and database
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
// Start a transaction
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
// Open the Block table record Model space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;
// Create a lightweight polyline
using (Polyline acPoly = new Polyline())
{
acPoly.AddVertexAt(0, new Point2d(1, 1), 0, 0, 0);
acPoly.AddVertexAt(1, new Point2d(1, 2), 0, 0, 0);
acPoly.AddVertexAt(2, new Point2d(2, 2), 0, 0, 0);
acPoly.AddVertexAt(3, new Point2d(3, 2), 0, 0, 0);
acPoly.AddVertexAt(4, new Point2d(4, 4), 0, 0, 0);
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acPoly);
acTrans.AddNewlyCreatedDBObject(acPoly, true);
// Sets the bulge at index 3
acPoly.SetBulgeAt(3, -0.5);
// Add a new vertex
acPoly.AddVertexAt(5, new Point2d(4, 1), 0, 0, 0);
// Sets the start and end width at index 4
acPoly.SetStartWidthAt(4, 0.1);
acPoly.SetEndWidthAt(4, 0.5);
// Close the polyline
acPoly.Closed = true;
}
// Save the new objects to the database
acTrans.Commit();
}
}