Untitled
unknown
plain_text
a year ago
5.7 kB
9
Indexable
[CommandMethod("CBD")]
public void CBD()
{
try
{
using (Transaction trCad = Manager.DocData.TransactionManager.StartTransaction())
{
// Solicitar ao usuário que selecione linhas e arcos
PromptSelectionOptions selOpts = new PromptSelectionOptions();
selOpts.MessageForAdding = "Selecione linhas e arcos para formar os limites: ";
PromptSelectionResult selRes = Manager.DocEditor.GetSelection(selOpts);
if (selRes.Status != PromptStatus.OK)
{
Manager.DocEditor.WriteMessage("\nSeleção cancelada.");
return;
}
SelectionSet selSet = selRes.Value;
List<Autodesk.AutoCAD.DatabaseServices.Curve> curves = new List<Autodesk.AutoCAD.DatabaseServices.Curve>();
// Adicionar as entidades selecionadas (linhas e arcos) à lista de curvas
foreach (SelectedObject selObj in selSet)
{
if (selObj != null)
{
Autodesk.AutoCAD.DatabaseServices.Entity ent = trCad.GetObject(selObj.ObjectId, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (ent is Autodesk.AutoCAD.DatabaseServices.Curve curve)
{
// Adiciona todas as curvas, sejam linhas ou arcos
curves.Add(curve);
}
}
}
if (curves.Count == 0)
{
Manager.DocEditor.WriteMessage("\nNenhum objeto válido selecionado.");
return;
}
// Definir a caixa delimitadora e os limites de análise
Extents3d boundingBox = GetBoundingBox(curves); // Obtemos a caixa delimitadora de todas as curvas selecionadas
List<Polyline> polylines = new List<Polyline>();
double step = 0.5; // Ajuste do passo para varredura
// Iterar pelos pontos da grade
for (double x = boundingBox.MinPoint.X; x <= boundingBox.MaxPoint.X; x += step)
{
for (double y = boundingBox.MinPoint.Y; y <= boundingBox.MaxPoint.Y; y += step)
{
Point3d testPoint = new Point3d(x, y, 0);
try
{
// Tentar traçar boundaries a partir de cada ponto da grade
using (DBObjectCollection boundaryObjects = Manager.DocEditor.TraceBoundary(testPoint, false))
{
foreach (Autodesk.AutoCAD.DatabaseServices.DBObject obj in boundaryObjects)
{
Polyline polyline = obj as Polyline;
if (polyline != null && polyline.Area > 0) // Certificar que o perímetro é válido (área maior que zero)
{
polylines.Add(polyline);
}
}
}
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
Manager.DocEditor.WriteMessage($"\nErro ao traçar boundary em ({x}, {y}): {ex.Message}");
}
}
}
// Adicionar as polylines ao espaço de trabalho
if (polylines.Count > 0)
{
BlockTable blockTable = (BlockTable)trCad.GetObject(Manager.DocData.BlockTableId, OpenMode.ForRead);
BlockTableRecord modelSpace = (BlockTableRecord)trCad.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
foreach (Polyline polyline in polylines)
{
modelSpace.AppendEntity(polyline);
trCad.AddNewlyCreatedDBObject(polyline, true);
}
Manager.DocEditor.WriteMessage($"\n{polylines.Count} limites criados com sucesso.");
}
else
{
Manager.DocEditor.WriteMessage("\nNenhum limite foi criado.");
}
trCad.Commit();
}
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
Manager.DocEditor.WriteMessage("\nErro: " + ex.Message);
}
}
// Função para calcular a caixa delimitadora de todas as curvas
private Extents3d GetBoundingBox(List<Autodesk.AutoCAD.DatabaseServices.Curve> curves)
{
Extents3d boundingBox = new Extents3d();
foreach (Autodesk.AutoCAD.DatabaseServices.Curve curve in curves)
{
boundingBox.AddExtents(curve.GeometricExtents);
}
return boundingBox;
}
}
}
Editor is loading...
Leave a Comment