Untitled
unknown
plain_text
a month ago
5.7 kB
1
Indexable
Never
[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; } } }
Leave a Comment