c# - traba - Bloque de inserción de CAD con miniatura debajo del mouse
porque mi mouse se traba a cada rato (2)
Necesito insertar un DWG externo en un dibujo de AutoCAD a través del complemento C #. Necesito "preguntar" al usuario el punto de inserción y la rotación del bloque insertado. Hasta ahora siempre he usado una función de lisp que llama al comando "._- insert" que da una miniatura del bloque debajo del mouse, permite al usuario hacer clic en el dibujo para establecer el punto de inserción y desde ese punto permite usuario para hacer clic una vez más para establecer la rotación. Ahora quiero evitar el uso de Lisp o el uso de API de bajo nivel de AutoCAD porque necesito una solución que se ejecute en varios entornos de CAD. Lo que encontré es algo como esto:
public static void InsertDwg(string dwgName)
{
CADAPI.ApplicationServices.Document doc = CADAPI.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
CADDB.Database db = doc.Database;
CADAPI.EditorInput.Editor ed = doc.Editor;
CADDB.ObjectId ObjId;
using (CADDB.Transaction trx = db.TransactionManager.StartTransaction())
{
CADDB.BlockTable bt = db.BlockTableId.GetObject(CADDB.OpenMode.ForRead) as CADDB.BlockTable;
CADDB.BlockTableRecord btrMs = bt[CADDB.BlockTableRecord.ModelSpace].GetObject(CADDB.OpenMode.ForWrite) as CADDB.BlockTableRecord;
using (CADDB.Database dbInsert = new CADDB.Database(false, true))
{
dbInsert.ReadDwgFile(dwgName, CADDB.FileOpenMode.OpenForReadAndAllShare, true, string.Empty);
ObjId = db.Insert(Path.GetFileNameWithoutExtension(dwgName), dbInsert, true);
}
CADAPI.EditorInput.PromptPointOptions ppo = new CADAPI.EditorInput.PromptPointOptions("/nInsertion Point");
CADAPI.EditorInput.PromptAngleOptions ppa = new CADAPI.EditorInput.PromptAngleOptions("/nInsert Rotation");
CADAPI.EditorInput.PromptPointResult ppr;
ppr = ed.GetPoint(ppo);
CADAPI.EditorInput.PromptDoubleResult ppd = ed.GetAngle(ppa);
if (ppr.Status == CADAPI.EditorInput.PromptStatus.OK)
{
CADGEOM.Point3d insertPt = ppr.Value;
CADDB.BlockReference bref = new CADDB.BlockReference(insertPt, ObjId);
btrMs.AppendEntity(bref);
trx.AddNewlyCreatedDBObject(bref, true);
trx.Commit();
}
}
}
Pero aquí tengo dos problemas: el principal es que no hay vista previa debajo del mouse. El segundo es que el usuario debe hacer clic 3 veces en lugar de 2 para establecer tanto el punto de inserción como la rotación.
¿Hay alguna forma de que no use algún tipo de SendCommand
y haga todo esto? TIA
Parece que Jigging es el camino a seguir para permitir la vista previa. Tengo tres enlaces para ti.
- Jigging entidades múltiples con DrawJig
- Usar una plantilla para rotar una entidad de AutoCAD a través de .NET
- Usar gráficos transitorios para simular el comando MOVE de AutoCAD usando .NET
El primero es un ejemplo de creación de una plantilla simple con polilíneas; podría extender esto a un bloque.
El segundo enlace es similar pero aplica rotación a la mezcla. Esto se aplica a un rectángulo, pero de nuevo podría modificarse para acomodar un bloque.
El tercer enlace describe un método diferente: la interfaz de gráficos transitorios de AutoCAD. Debe usar AutoCAD 2009 o posterior para usar este método.
Los dos últimos enlaces provienen del blog A través de la interfaz , donde puede encontrar más ejemplos y es un muy buen punto de partida si tiene problemas, especialmente para codificar C #.
Querrá utilizar la clase AcEdJig. Proporciona la vista previa. Tendrá que escribir el código para recoger el punto de inserción y la rotación, y para transformar el bloque en consecuencia.
Aquí está el primer enlace de mi búsqueda de Google, por ejemplo, código de uso.