Comunidad
AutoCAD - Todos los productos - Español
Bienvenido/a al foro de los productos de la familia AutoCAD de Autodesk! Comparte tu conocimiento, haz preguntas y explora los temas populares de AutoCAD.
cancelar
Mostrando los resultados de 
Mostrar  solo  | Buscar en lugar de 
Quiere decir: 

ayuda con desarrollo C# crear una polilinea

5 RESPUESTAS 5
RESUELTAS
Responder
Mensaje 1 de 6
Anonymous
871 Vistas, 5 Respuestas

ayuda con desarrollo C# crear una polilinea

hola que tal? estoy tratando desntro de la interfaz de autocad ingresar los parametros, pero me da errores o directamente no me dibuja lo que yo quiero. Si me pueden dar una mano! Gracias

 

using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Interop.Common;

namespace Tesis_Learn001
{
public class class1
{
[CommandMethod("Pista")]
public static void proyecto()
{
// 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 dialog window
Editor e = Application.DocumentManager.MdiActiveDocument.Editor;


PromptResult l_a = e.GetDouble("Largo de Pista");
int l = Convert.ToInt32(l_a);
PromptResult a_a = e.GetDouble("Ancho de Pista");
int a = Convert.ToInt32(a_a);

// Create a polyline with two segments
using (Polyline acPoly = new Polyline())
{
acPoly.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
acPoly.AddVertexAt(1, new Point2d(l, 0), 0, 0, 0);
acPoly.AddVertexAt(2, new Point2d(l, a), 0, 0, 0);
acPoly.AddVertexAt(3, new Point2d(0, a), 0, 0, 0);
acPoly.AddVertexAt(4, new Point2d(0, 0), 0, 0, 0);

// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acPoly);
acTrans.AddNewlyCreatedDBObject(acPoly, true);
}

// Save the new object to the database
acTrans.Commit();
}
}

}

}

Etiquetas (3)
5 RESPUESTAS 5
Mensaje 2 de 6
calderg1000
en respuesta a: Anonymous

Estimado @Anonymous 

En el siguiente link tienes información sobre el tema, https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-NET/files/GUID-EC036F5A-1F02-40D3-B348-4193BA58CF0C-htm.html

Espero te sea de ayuda.

Saludos.


Carlos Calderon G
EESignature
>Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

Mensaje 3 de 6
Anonymous
en respuesta a: calderg1000

hola Gracias por tu ayuda! el problema que tengo es que el usuario deberia interactuar con el codigo a travez de la interfaz de CAD, el problema esta que cuando defino un integer, y el usuario ingresa valores en autocad no me dibuja el rectangulo o directamente me da error.

Mensaje 4 de 6
fernando.prado
en respuesta a: Anonymous

Saludos @Anonymous 

Si entiendo bien dices que estas entrando directamente al código del programa!?

El código del programa es muy complejo y tiene muchas variables, pueda que estés interfiriendo con el correcto funcionamiento del CAD

Es mejor que lo hagas con rutinas aparte en list y se lo cargues como complemento o haciendo un programa aparte que se acople a CAD. Hay muchos programas o app's para cad que funcionan de esta forma, son complementos que se cargan por aparte no van dentro del código, ya que puedes dañar el programa.

 

https://apps.autodesk.com/ACD/es/Home/Index

 

https://knowledge.autodesk.com/es/search-result/caas/CloudHelp/cloudhelp/2019/ESP/AutoCAD-Customization/files/GUID-16DC15FC-5329-492E-B66A-401D49CF971F-htm.html

Mensaje 5 de 6
Organon
en respuesta a: Anonymous

@Anonymous 

 

Hola.

 

No explicas qué errores obtienes, ni muestras ninguna imagen al respecto, por lo que no es sencillo ayudarte. Echa un ojo al siguiente código, lo hice para que haga un rectángulo por medio de una polilínea:

 

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;


[assembly: CommandClass(typeof(ACADTools.CreateRectangle))]

namespace ACADTools
{
    public class CreateRectangle
    {
        [CommandMethod("CrRec")]
        public void CrRec()
        {
            // Get the current document and database, and start a transaction.
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            Editor acEd = acDoc.Editor;

            // Starts a new transaction with the Transaction Manager.
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                // Open the Block table record for read.
                BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;

                // Open the Block table record Model Space for write.
                BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                // Prompt for user input.
                // Click the first rectangle's corner.
                PromptPointOptions fstCnrPtOpt = new PromptPointOptions("\nIndique la primera esquina del rectángulo:");
                PromptPointResult fstCnrPtRes = acDoc.Editor.GetPoint(fstCnrPtOpt);
                Point3d fstCnr = fstCnrPtRes.Value;

                // Exit if the user presses ESC or cancels the command.
                if (fstCnrPtRes.Status == PromptStatus.Cancel) return;

                // Clic the second rectangle's corner.
                PromptPointOptions scdCnrPtOpt = new PromptPointOptions("\nIndique la segunda esquina del rectángulo:");
                PromptPointResult scdCnrPtRes = acDoc.Editor.GetPoint(scdCnrPtOpt);
                Point3d scdCnr = scdCnrPtRes.Value;

                // Exit if the user presses ESC or cancels the command.
                if (scdCnrPtRes.Status == PromptStatus.Cancel) return;

                // Get the missing corners.
                Point3d upperLeft = new Point3d(fstCnr.X, scdCnr.Y, 0);
                Point3d lowerRight = new Point3d(scdCnr.X, fstCnr.Y, 0);                

                // Create the rectangle.
                using (Polyline rec = new Polyline())
                {
                    rec.AddVertexAt(0, fstCnr.Convert2d(new Plane()), 0, 0, 0);
                    rec.AddVertexAt(1, upperLeft.Convert2d(new Plane()), 0, 0, 0);
                    rec.AddVertexAt(2, scdCnr.Convert2d(new Plane()), 0, 0, 0);
                    rec.AddVertexAt(3, lowerRight.Convert2d(new Plane()), 0, 0, 0);
                    rec.Closed = true;

                    // Appends the new object to model space.
                    acBlkTblRec.AppendEntity(rec);

                    // Appends to new object to the active transaction.
                    acTrans.AddNewlyCreatedDBObject(rec, true);
                }

                // Saves the changes to the database and closes the transaction.
                acTrans.Commit();
            }
        }
    }
}

 

P.D. Si quieres agregar el código con formato en tu mensaje, debes hacer clic en el icono de la imagen:

 

Código Formato.png

 

Saludos.


Arquitectura | Análisis CAD & BIM | Diseño Paramétrico | Programación
BIM-METADATA | LinkedIn | YouTube
Mensaje 6 de 6
Anonymous
en respuesta a: Organon

Hola! Gracias por tu ayuda me sirvio!. Con Respecto al "error" que no explico; no hay error ese es el problema que cuando guardo las variables que almaceno, y las posiciono sobre el sitio donde va la coordenada de la polilinea de esta forma:

 

PromptResult l_a = e.GetDouble("Largo de Pista");
int l = Convert.ToInt32(l_a);
PromptResult a_a = e.GetDouble("Ancho de Pista");
int a = Convert.ToInt32(a_a);

// Create a polyline with two segments
using (Polyline acPoly = new Polyline())
{
acPoly.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
acPoly.AddVertexAt(1, new Point2d(l, 0), 0, 0, 0); <---
acPoly.AddVertexAt(2, new Point2d(l, a), 0, 0, 0); <---
acPoly.AddVertexAt(3, new Point2d(0, a), 0, 0, 0);
acPoly.AddVertexAt(4, new Point2d(0, 0), 0, 0, 0);

 

Al ingresar los valores de a y l que quiero sobre la consola de AutoCAD el programa no hace nada solo me crea un punto. Creo que esta mejor explicado.

Lo que necesitaba (que usted ya lo solucione) era que cuando el usuario final del codigo (persona que no sabe programar) corra el *.dll que yo le proporciono, solamente interactue con la consola de AutoCAD. Justamente eso era lo que no estaba logrando!

Muchas Gracias por tu respuesta!! 🙂

¿No encontraste lo que buscabas? Pregúntale a la comunidad o comparte tus conocimientos.

Publicar en los foros  

Autodesk Design & Make Report

New events in the Spanish Community