Untitled

mail@pastecode.io avatar
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