Percorso HOME CAD C#

C#

Eliminare la formattazione di testo multilinea

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Domenica 27 Giugno 2010 18:44

Il solito Kean Walmsley di Through the Interface ha reso disponibile un altro listato di codice in C# per la compilazione di una utility che consente di annullare la formattazione di testi multilinea (MTESTO), sulla scia della precedente, di cui avevo parlato in questo articolo, che consentiva invece di trasformare il testo in maiuscolo o in minuscolo.

Come la precedente utility, anche questa è stata scritta solo per AutoCAD 2011 e non necessita di aprire l'editor, in quanto la modifica avviene cliccando direttamente sull'oggetto Mtesto da modificare utilizzando il comando SMF.

Il codice, che mi sono come al solito solo limitato a compilare e il cui download potete effettuare alla fine dell'articolo, è riportato in questo articolo di Walmsley ed è il seguente:

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Runtime;

 

namespace MTextEditing

{

public class Commands

{

[CommandMethod("SMF")]

public void StripMTextFormatting()

{

Document doc =

Application.DocumentManager.MdiActiveDocument;

Database db = doc.Database;

Editor ed = doc.Editor;

 

// Specifically select an MText object

 

PromptEntityOptions peo =

new PromptEntityOptions(

"\nSelect MText to strip of formatting: "

);

peo.SetRejectMessage("\nObject must me MText.");

peo.AddAllowedClass(typeof(MText), false);

 

PromptEntityResult per = ed.GetEntity(peo);

if (per.Status != PromptStatus.OK)

return;

 

Transaction tr =

doc.TransactionManager.StartTransaction();

using (tr)

{

// We only need our MText open for read

 

DBObject obj =

tr.GetObject(per.ObjectId, OpenMode.ForRead, false);

MText mt = obj as MText;

 

if (mt == null)

return;

 

// Create a text editor object for the MText

 

TextEditor te = TextEditor.CreateTextEditor(mt);

if (te == null)

return;

 

// Simply select the entire contents and strip

// all formatting from the selection

 

te.SelectAll();

te.Selection.RemoveAllFormatting();

 

// Be sure to save the results from the editor

 

te.Close(TextEditor.ExitStatus.ExitSave);

tr.Commit();

}

}

}

}

Questo è un esempio di testo da modificare dove sono stati impostati dei colori e il tipo di carattere:

Testo originale prima della modifica

Ora utilizziamo il comando SMF per eliminare la formattazione impostata (colori e tipo carattere) e il testo tornerà al carattere di default di AutoCAD eliminando qualsiasi colore:

Comando CTU: annulla la formattazione

In questo articolo ho spiegato cosa si intende per compilazione di un codice, nonchè indicato il procedimento e i software per la compilazione in C#. Il file va caricato con il comando NETLOAD e, come specificato all'inizio, è funzionante solo sulla versione di AutoCAD 2011.

Potete effettuare il download dell'utility facendo click qui in modo da poterlo utilizzare subito in AutoCAD.

Tags: .Net | AutoCAD | Autodesk | Csharp | Utility

 

Cambiare il testo multilinea da maiuscolo a minuscolo e viceversa in AutoCAD 2011

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Venerdì 25 Giugno 2010 23:02

Su Through the Interface è disponibile il codice in C# per la compilazione di una utility per AutoCAD 2011, che consente di cambiare velocemente il testo multilinea (TESTOM) da maiuscolo a minuscolo e viceversa, senza la necessità di aprire l'editor ma cliccando direttamente sull'oggetto testo da modificare.

L'utility si compone di due comandi: CTU e CTL. Il primo consente di trasformare il testo in maiuscolo e il secondo in minuscolo.

Il codice, che mi sono solo limitato a compilare ed è possibile scaricare alla fine di questo articolo per utilizzarlo subito in AutoCAD 2011, è riportato in questo articolo ed è il seguente:

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Runtime;

 

namespace MTextEditing

{

public class Commands

{

[CommandMethod("CTU")]

public void ChangeToUppercase()

{

ChangeCase(true);

}

 

[CommandMethod("CTL")]

public void ChangeToLowercase()

{

ChangeCase(false);

}

 

private void ChangeCase(bool upper)

{

Document doc =

Application.DocumentManager.MdiActiveDocument;

Database db = doc.Database;

Editor ed = doc.Editor;

 

// Specifically select an MText object

 

PromptEntityOptions peo =

new PromptEntityOptions(

string.Format(

"\nSelect MText to change to {0}case: ",

upper ? "upper" : "lower"

)

);

peo.SetRejectMessage("\nObject must be MText.");

peo.AddAllowedClass(typeof(MText), false);

 

PromptEntityResult per = ed.GetEntity(peo);

if (per.Status != PromptStatus.OK)

return;

 

Transaction tr =

doc.TransactionManager.StartTransaction();

using (tr)

{

// We only need our MText open for read

 

DBObject obj =

tr.GetObject(per.ObjectId, OpenMode.ForRead, false);

MText mt = obj as MText;

 

if (mt == null)

return;

 

// Create a text editor object for the MText

 

TextEditor te = TextEditor.CreateTextEditor(mt);

if (te == null)

return;

 

// Select the entire contents of the MText

 

te.SelectAll();

TextEditorSelection sel = te.Selection;

if (sel == null)

return;

 

// Check whether we can change the selection's

// case, and then do so

 

if (sel.CanChangeCase)

{

if (upper)

sel.ChangeToUppercase();

else

sel.ChangeToLowercase();

}

 

// Be sure to save the results from the editor

 

te.Close(TextEditor.ExitStatus.ExitSave);

tr.Commit();

}

}

}

}

Questo è un esempio di testo da modificare:

Testo originale prima della modifica

Ora utilizziamo il comando CTU per trasformare tutto il testo in maiuscolo:

Comando CTU: trasforma in maiuscolo

e ora invece il comando CTL per trasformarlo tutto in minuscolo:

Comando CTL: trasforma in maiuscolo

Come compilare il codice: in questo articolo ho spiegato il procedimento e indicato i software per la compilazione di utility in C#, nonchè indicato cosa si intende per compilazione di un codice. L’utility va caricata con il comando NETLOAD.

Come specificato all'inizio, l'utility è funzionante solo sulla versione di AutoCAD 2011.

Potete effettuare il download del codice che ho compilato facendo click qui.

Tags: .Net | AutoCAD | Autodesk | Csharp | Utility

 

Creare screenshots di AutoCAD

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Venerdì 27 Novembre 2009 00:45

La Autodesk, nel suo Autodesk Labs, ha pubblicato il plug-in del mese di novembre per AutoCAD (e naturalmente per gli altri software basati su piattaforma AutoCAD). Dopo il precedente QSAVEAS del mese di ottobre, di cui avevo parlato in questo articolo, per il mese di novembre ha rilasciato SCREENSHOT.

Questa nuova utility è l'evoluzione di CSS, di cui avevo parlato qui e che avevo provveduto a compilare.

Anche questa utility, come la precedente, è stata scritta in C# e il listato del codice è stato modificato sempre da Kean Walmsley di Autodesk che è l'Autore naturalmente anche di CSS. In questo primo articolo sul suo Through the Interface è riportata la prima versione del codice, poi rivista in questo secondo articolo dove sono riportate delle immagini esplicative delle funzioni svolte dall'utility. Successivamente con questo articolo e con quest'altro sono state pubblicate ulteriori modifiche al codice.

Mentre CSS consente soltanto di creare in contemporanea due screenshots di AutoCAD, uno della sua finestra e l'altro della sua area di lavoro, SCREENSHOT permette oltre a questo di creare screenshot di singoli oggetti che vengono selezionati.

Select first point of capture window or [Document/Application/Objects/Settings]:


Inoltre, nei settaggi, consente di scegliere tra varie opzioni di output:

Setting to change [Output/Print/Background/Foreground/Grayscale/Exit] <Exit>:

E' possibile scegliere la modalità con cui salvare gli screenshot (se nella clipboard di Windows oppure in un salvataggio con nome) oppure se inviarli direttamente alla stampate. Inoltre, è possibile avere uno screenshot con l'area di lavoro bianca, oppure con tutti gli oggetti convertiti in nero od ancora nelle tonalità del grigio.

Per il funzionamento dell'utility basta copiare il file ADNPlugin-Screenshot.dll (contenuto nella cartella compressa di download) in una directory del proprio pc, preferibilmente nella directory principale di AutoCAD, e dare in questo il comando NETLOAD scegliendo il file copiato. AutoCAD registrerà il file e nelle successive sessioni il comando SCREENSHOT continuerà a funzionare.

Il comando REMOVESS, invece, consentirà di "disinstallare" l'utility. In ogni caso leggere il file ReadMe contenuto nel file compresso.

SCREENSHOT è sia per AutoCAD a 32 bit che a 64 bit. Nel file compresso del download è compreso anche il codice sorgente, per chi vuole divertirsi a studiare o modificare eventualmente l’utility.

E' possibile effettuare il download facendo click qui.

Tags: .Net | AutoCAD | Autodesk | Csharp | Utility

 

Salvataggi veloci con nome e con suffisso numerico progressivo

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Mercoledì 04 Novembre 2009 09:21

Su Through the Interface è disponibile il codice in C# per la compilazione di una utility per AutoCAD, che implementa una nuova versione del comando SALVACOME (_SAVEAS).

Con questa utility, dopo la prima digitazione del suo comando che è QSAVEAS, viene richiesta la directory dove salvare il file. Ad ogni successiva ripetizione del comando viene effettuato in automatico un nuovo salvataggio del file, nella stessa directory indicata in precedenza, con l’aggiunta di un suffisso numerico progressivo ad ogni salvataggio.

Il codice, che mi sono solo limitato a compilare ed è possibile scaricare alla fine di questo articolo per utilizzarlo subito in AutoCAD, è riportato qui ed è il seguente:

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Runtime;

using System.IO;

 

namespace QuickSaveAs

{

public class Commands

{

// Set up static variable for the path to our folder

// of drawings, as well as the base filename and a

// counter to make the unique filename

 

static string _path = "",

_base = "";

static int _count = 0;

 

// Various filename and path-related constants

 

const string sfxSep = " ",

extSep = ".",

pthSep = "\\",

lspSep = "/",

dwgExt = ".dwg";

 

// Our QuickSaveAs command

 

[CommandMethod("QSAVEAS")]

public void QuickSaveAs()

{

Document doc =

Application.DocumentManager.MdiActiveDocument;

Editor ed = doc.Editor;

Database db = doc.Database;

 

// If this is the first time run...

 

if (_path == "" || _base == "")

{

// Ask the user for a base file location

 

PromptSaveFileOptions opts =

new PromptSaveFileOptions(

"Select location to save first drawing file"

);

opts.Filter = "Drawing (*.dwg)|*.dwg";

PromptFileNameResult pr =

ed.GetFileNameForSave(opts);

 

// Delete the file, if it exists

// (may be a problem if the file is in use)

 

if (File.Exists(pr.StringResult))

{

try

{

File.Delete(pr.StringResult);

}

catch { }

}

 

if (pr.Status == PromptStatus.OK)

{

// If a file was selected, and it contains a path...

 

if (pr.StringResult.Contains(pthSep))

{

// Separate the path from the file name

 

int idx = pr.StringResult.LastIndexOf(pthSep);

_path =

pr.StringResult.Substring(0, idx);

string fullname =

pr.StringResult.Substring(idx + 1);

 

// If the path has an extension (this should always

// be the case), extract the base file name

 

if (fullname.Contains(extSep))

{

_base =

fullname.Substring(

0,

fullname.LastIndexOf(extSep)

);

}

}

}

}

 

// Assuming the path and name were set appropriately...

 

if (_path != "" && _base != "")

{

string name = _base;

 

// Add our suffix if not the first time run

 

if (_count > 0)

name += sfxSep + _count.ToString();

 

// Our drawing is located in the base path

 

string dwgPath = _path + pthSep + name + dwgExt;

 

// Now we want to save our drawing and use the image

// for our tool icon

 

// Using either COM or .NET doesn't generate a

// thumbnail in the resultant file (or its Database)

 

// .NET:

// db.SaveAs(dwgPath, false, DwgVersion.Current, null);

 

// COM:

// AcadDocument adoc = (AcadDocument)doc.AcadDocument;

// adoc.SaveAs(dwgPath, AcSaveAsType.acNative, null);

 

// So we'll send commands to the command-line

// We'll use LISP, to avoid having to set FILEDIA to 0

 

object ocmd = Application.GetSystemVariable("CMDECHO");

string dwgPath2 = dwgPath.Replace(pthSep, lspSep);

 

doc.SendStringToExecute(

"(setvar \"CMDECHO\" 0)" +

"(command \"_.SAVEAS\" \"\" \"" + dwgPath2 + "\")" +

"(setvar \"CMDECHO\" " + ocmd.ToString() + ")" +

"(princ) ",

false,

false,

false

);

 

// Print a confirmation message for the DWG save

// (which actually gets displayed before the queued

// string gets executed, but anyway)

 

ed.WriteMessage("\nSaved to: \"" + dwgPath + "\"");

 

_count++;

}

}

}

}

Come compilare il codice: in questo articolo ho spiegato il procedimento e indicato i software per la compilazione di utility in C#, nonchè indicato cosa si intende per compilazione di un codice. L’utility va caricata con il comando NETLOAD.

Naturalmente l’utility è funzionante solo sulle ultime versioni di AutoCAD che supportano lo sviluppo di applicazioni .NET.

Potete effettuare il download del codice che ho compilato facendo click qui.

Tags: .Net | AutoCAD | Autodesk | Csharp | Utility

 

Clipboard Manager per AutoCAD

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Domenica 11 Ottobre 2009 17:51

La Autodesk, nel suo Autodesk Labs, ha pubblicato il plug-in del mese di ottobre per AutoCAD (e naturalmente per altri software basati su piattaforma AutoCAD). Dopo il precedente OffsetInXref del mese di settembre, di cui avevo parlato in questo articolo, per il mese di ottobre ha rilasciato Clipboard Manager.

Anche questa utility, come la precedente è stata scritta in C#. Il listato del codice, modificato dal "solito" Kean Walmsley di Autodesk, è pubblicato in questo articolo sul suo Through the Interface.

Questa utility Autodesk consente di mantenere in memoria tutti quegli elementi copiati e/o tagliati in un disegno AutoCAD tramite i rispettivi comandi COPIACLIP o TAGLIACLIP (o utilizzo delle classiche abbreviazioni da tastiera: CTRL+C e CTRL+V), comandi che appunto inseriscono il loro contenuto negli appunti di Windows.

Utilizzando il comando CLIPBOARD dell'utility, appare un pannello laterale tramite il quale è possibile avere uno storico degli elementi copiati o tagliati con quei due comandi suddetti.

A ogni operazione di COPIACLIP o TAGLIACLIP compare una nuova riga nel pannello. E' possibile rinominare ogni singola operazione e riutilizzare lo storico degli elementi che sono stati copiati o tagliati (o eventualmente incollarli anche come blocchi).

Clipboard Manager

Per il funzionamento dell'utility basta copiare il file ADNPlugin-ClipboardManager.dll (contenuto nella cartella compressa di download) in una directory del proprio pc, preferibilmente nella directory principale di AutoCAD, e dare in questo il comando NETLOAD scegliendo il file copiato. AutoCAD registrerà il file e nelle successive sessioni il comando CLIPBOARD continuerà a funzionare.

Il comando REMOVECB, invece, consentirà di "disinstallare" l'utility. In ogni caso leggere il file ReadMe contenuto nel file compresso.

Clipboard Manager è sia per AutoCAD a 32 bit che a 64 bit. Nel file compresso del download è compreso anche il codice sorgente, per chi vuole divertirsi a studiare o modificare eventualmente l’utility.

E' possibile effettuare il download facendo click qui.

Tags: .Net | AutoCAD | Autodesk | Csharp | Utility

 

Creare mesh poliedriche da una serie di punti 3D

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Mercoledì 07 Ottobre 2009 11:41

Su Through the Interface è disponibile il codice in C# per la compilazione di una utility per AutoCAD, che consente di effettuare una triangolazione su una serie di punti in 3D, in modo da creare una mesh poliedrica. Il codice, che mi sono solo limitato a compilare ed è possibile scaricare alla fine di questo articolo per utilizzarlo subito in AutoCAD, è riportato qui ed è il seguente:

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Geometry;

using System;

public class Triangulate

{

public bool circum(

double x1, double y1, double x2,

double y2, double x3, double y3,

ref double xc, ref double yc, ref double r)

{

// Calculation of circumscribed circle coordinates and

// squared radius

const double eps = 1e-6;

const double big = 1e12;

bool result = true;

double m1, m2, mx1, mx2, my1, my2, dx, dy;

if ((Math.Abs(y1 - y2) < eps) && (Math.Abs(y2 - y3) < eps))

{

result = false;

xc = x1; yc = y1; r = big;

}

else

{

if (Math.Abs(y2 - y1) < eps)

{

m2 = -(x3 - x2) / (y3 - y2);

mx2 = (x2 + x3) / 2;

my2 = (y2 + y3) / 2;

xc = (x2 + x1) / 2;

yc = m2 * (xc - mx2) + my2;

}

else if (Math.Abs(y3 - y2) < eps)

{

m1 = -(x2 - x1) / (y2 - y1);

mx1 = (x1 + x2) / 2;

my1 = (y1 + y2) / 2;

xc = (x3 + x2) / 2;

yc = m1 * (xc - mx1) + my1;

}

else

{

m1 = -(x2 - x1) / (y2 - y1);

m2 = -(x3 - x2) / (y3 - y2);

if (Math.Abs(m1 - m2) < eps)

{

result = false;

xc = x1;

yc = y1;

r = big;

}

else

{

mx1 = (x1 + x2) / 2;

mx2 = (x2 + x3) / 2;

my1 = (y1 + y2) / 2;

my2 = (y2 + y3) / 2;

xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);

yc = m1 * (xc - mx1) + my1;

}

}

}

dx = x2 - xc;

dy = y2 - yc;

r = dx * dx + dy * dy;

return result;

}

[CommandMethod("TRIANG")]

public void TriangulateCommand()

{

const int maxpoints = 32767;

Document doc =

Application.DocumentManager.MdiActiveDocument;

Database db = doc.Database;

Editor ed = doc.Editor;

TypedValue[] tvs = { new TypedValue(0, "POINT") };

SelectionFilter sf =

new SelectionFilter(tvs);

PromptSelectionOptions pso = new PromptSelectionOptions();

pso.MessageForAdding = "Select Points:";

pso.AllowDuplicates = false;

PromptSelectionResult psr = ed.GetSelection(pso, sf);

if (psr.Status == PromptStatus.Error) return;

if (psr.Status == PromptStatus.Cancel) return;

SelectionSet ss = psr.Value;

int npts = ss.Count;

if (npts < 3)

{

ed.WriteMessage("Minimum 3 points must be selected!");

return;

}

if (npts > maxpoints)

{

ed.WriteMessage("Maximum nuber of points exceeded!");

return;

}

int i, j, k, ntri, ned, status1 = 0, status2 = 0;

bool status;

// Point coordinates

double[] ptx = new double[maxpoints + 3];

double[] pty = new double[maxpoints + 3];

double[] ptz = new double[maxpoints + 3];

// Triangle definitions

int[] pt1 = new int[maxpoints * 2 + 1];

int[] pt2 = new int[maxpoints * 2 + 1];

int[] pt3 = new int[maxpoints * 2 + 1];

// Circumscribed circle

double[] cex = new double[maxpoints * 2 + 1];

double[] cey = new double[maxpoints * 2 + 1];

double[] rad = new double[maxpoints * 2 + 1];

double xmin, ymin, xmax, ymax, dx, dy, xmid, ymid;

int[] ed1 = new int[maxpoints * 2 + 1];

int[] ed2 = new int[maxpoints * 2 + 1];

ObjectId[] idarray = ss.GetObjectIds();

Transaction tr =

db.TransactionManager.StartTransaction();

using (tr)

{

DBPoint ent;

k = 0;

for (i = 0; i < npts; i++)

{

ent =

(DBPoint)tr.GetObject(idarray[k], OpenMode.ForRead, false);

ptx[i] = ent.Position[0];

pty[i] = ent.Position[1];

ptz[i] = ent.Position[2];

for (j = 0; j < i; j++)

if ((ptx[i] == ptx[j]) && (pty[i] == pty[j]))

{

i--; npts--; status2++;

}

k++;

}

tr.Commit();

}

if (status2 > 0)

ed.WriteMessage(

"\nIgnored {0} point(s) with same coordinates.",

status2

);

// Supertriangle

xmin = ptx[0]; xmax = xmin;

ymin = pty[0]; ymax = ymin;

for (i = 0; i < npts; i++)

{

if (ptx[i] < xmin) xmin = ptx[i];

if (ptx[i] > xmax) xmax = ptx[i];

if (pty[i] < xmin) ymin = pty[i];

if (pty[i] > xmin) ymax = pty[i];

}

dx = xmax - xmin; dy = ymax - ymin;

xmid = (xmin + xmax) / 2; ymid = (ymin + ymax) / 2;

i = npts;

ptx[i] = xmid - (90 * (dx + dy)) - 100;

pty[i] = ymid - (50 * (dx + dy)) - 100;

ptz[i] = 0;

pt1[0] = i;

i++;

ptx[i] = xmid + (90 * (dx + dy)) + 100;

pty[i] = ymid - (50 * (dx + dy)) - 100;

ptz[i] = 0;

pt2[0] = i;

i++;

ptx[i] = xmid;

pty[i] = ymid + 100 * (dx + dy + 1);

ptz[i] = 0;

pt3[0] = i;

ntri = 1;

circum(

ptx[pt1[0]], pty[pt1[0]], ptx[pt2[0]],

pty[pt2[0]], ptx[pt3[0]], pty[pt3[0]],

ref cex[0], ref cey[0], ref rad[0]

);

// main loop

for (i = 0; i < npts; i++)

{

ned = 0;

xmin = ptx[i]; ymin = pty[i];

j = 0;

while (j < ntri)

{

dx = cex[j] - xmin; dy = cey[j] - ymin;

if (((dx * dx) + (dy * dy)) < rad[j])

{

ed1[ned] = pt1[j]; ed2[ned] = pt2[j];

ned++;

ed1[ned] = pt2[j]; ed2[ned] = pt3[j];

ned++;

ed1[ned] = pt3[j]; ed2[ned] = pt1[j];

ned++;

ntri--;

pt1[j] = pt1[ntri];

pt2[j] = pt2[ntri];

pt3[j] = pt3[ntri];

cex[j] = cex[ntri];

cey[j] = cey[ntri];

rad[j] = rad[ntri];

j--;

}

j++;

}

for (j = 0; j < ned - 1; j++)

for (k = j + 1; k < ned; k++)

if ((ed1[j] == ed2[k]) && (ed2[j] == ed1[k]))

{

ed1[j] = -1; ed2[j] = -1; ed1[k] = -1; ed2[k] = -1;

}

for (j = 0; j < ned; j++)

if ((ed1[j] >= 0) && (ed2[j] >= 0))

{

pt1[ntri] = ed1[j]; pt2[ntri] = ed2[j]; pt3[ntri] = i;

status =

circum(

ptx[pt1[ntri]], pty[pt1[ntri]], ptx[pt2[ntri]],

pty[pt2[ntri]], ptx[pt3[ntri]], pty[pt3[ntri]],

ref cex[ntri], ref cey[ntri], ref rad[ntri]

);

if (!status)

{

status1++;

}

ntri++;

}

}

// removal of outer triangles

i = 0;

while (i < ntri)

{

if ((pt1[i] >= npts) || (pt2[i] >= npts) || (pt3[i] >= npts))

{

ntri--;

pt1[i] = pt1[ntri];

pt2[i] = pt2[ntri];

pt3[i] = pt3[ntri];

cex[i] = cex[ntri];

cey[i] = cey[ntri];

rad[i] = rad[ntri];

i--;

}

i++;

}

tr = db.TransactionManager.StartTransaction();

using (tr)

{

BlockTable bt =

(BlockTable)tr.GetObject(

db.BlockTableId,

OpenMode.ForRead,

false

);

BlockTableRecord btr =

(BlockTableRecord)tr.GetObject(

bt[BlockTableRecord.ModelSpace],

OpenMode.ForWrite,

false

);

PolyFaceMesh pfm = new PolyFaceMesh();

btr.AppendEntity(pfm);

tr.AddNewlyCreatedDBObject(pfm, true);

for (i = 0; i < npts; i++)

{

PolyFaceMeshVertex vert =

new PolyFaceMeshVertex(

new Point3d(ptx[i], pty[i], ptz[i])

);

pfm.AppendVertex(vert);

tr.AddNewlyCreatedDBObject(vert, true);

}

for (i = 0; i < ntri; i++)

{

FaceRecord face =

new FaceRecord(

(short)(pt1[i] + 1),

(short)(pt2[i] + 1),

(short)(pt3[i] + 1),

0

);

pfm.AppendFaceRecord(face);

tr.AddNewlyCreatedDBObject(face, true);

}

tr.Commit();

}

if (status1 > 0)

ed.WriteMessage(

"\nWarning! {0} thin triangle(s) found!" +

" Wrong result possible!",

status1

);

Application.UpdateScreen();

}

}

Nel codice è riportato il comando dell'utility che è TRIANG.

Come compilare il codice: in questa discussione ho spiegato il procedimento e indicato i software per la compilazione di utility in C#, nonchè spiegato cosa si intende per compilazione di un codice.

Dopo aver caricato l'utility con il comando NETLOAD, digitando TRIANG (o altro comando da voi modificato) potrete creare la triangolazione di una serie di punti.

Vediamo ora il funzionamento dell’utility. Creiamo una serie di punti posti a quote diverse:

TRIANG punti

Digitiamo il comando TRIANG, in modo da avere lo sviluppo della mesh poliedrica, e selezioniamo i punti:

TRIANG triangolazione

Impostando la visualizzazione 3D vedremo il risultato:

TRIANG visualizzazione 3d

Naturalmente l’utility è funzionante solo sulle ultime versioni di AutoCAD che supportano lo sviluppo di applicazioni .NET.

Potete effettuare il download del codice che ho compilato facendo click qui.

Tags: .Net | AutoCAD | Autodesk | Csharp | Utility

 

OffsetInXref: abilitare il comando OFFSET per xrif e blocchi

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Giovedì 24 Settembre 2009 07:57

La Autodesk nel suo Autodesk Labs ha pubblicato il primo dei suoi plugin per AutoCAD (e naturalmente per altri software basati su piattaforma AutoCAD) che avranno una cadenza di pubblicazione mensile.

Il primo plug-in del mese, per settembre, è OffsetInXref che consente di abilitare il comando OFFSET per xrif e blocchi.

Il plug-in è stato scritto in C# dal solito Kean Walmsley di Through the Interface. Una prima versione del codice, che potete trovare in questo articolo, era stata scritta per la sola abilitazione del comando OFFSET agli xrif. Successivamente Kean Walmsley ha modificato il codice e ha aggiunto la possibilità di utilizzare il comando anche per blocchi e xlinee (queste ultime in riferimento a blocchi e xrif). Potete trovare la seconda versione del codice qui.

OffsetInXref è disponibile per il download sia per AutoCAD a 32 bit che a 64 bit. Nel file compresso del download è compreso anche il codice sorgente, per chi vuole divertirsi a studiare o modificare eventualmente l’utility.

Per il funzionamento dell'utility basta copiare il file ADNPlugin-OffsetInXref.dll corrispondente al proprio sistema (32 o 64 bit) in una directory del proprio pc, preferibilmente nella directory principale di AutoCAD, e dare in questo il comando NETLOAD scegliendo il file copiato. AutoCAD registrerà il file e nelle successive sessioni il comando OFFSET continuerà a funzionare secondo le nuove impostazioni date.

Il comando REMOVEXO, invece, contentirà di disinstallare l'utility. In ogni caso leggere il file ReadMe contenuto nel file compresso.

E' possibile effettuare il download facendo click qui.

Tags: .Net | AutoCAD | Autodesk | Csharp | Utility

 

Creare screenshots di AutoCAD usando il C#

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Lunedì 21 Settembre 2009 23:52

Su Through the Interface è disponibile il codice in C# per la compilazione di una utility che consente di creare in contemporanea due screenshots tramite AutoCAD: uno della sua finestra e l'altro della sua area di lavoro. Il codice, riportato qui, è il seguente:

using acApp = Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.Runtime;

using System.Drawing.Imaging;

using System.Drawing;

 

namespace ScreenshotTest

{

public class Commands

{

[CommandMethod("CSS")]

static public void CaptureScreenShot()

{

ScreenShotToFile(

acApp.Application.MainWindow,

"c:\\main-window.png",

0, 0, 0, 0

);

ScreenShotToFile(

acApp.Application.DocumentManager.MdiActiveDocument.Window,

"c:\\doc-window.png",

30, 26, 10, 10

);

}

 

private static void ScreenShotToFile(

Autodesk.AutoCAD.Windows.Window wd,

string filename,

int top, int bottom, int left, int right

)

{

Point pt = wd.Location;

Size sz = wd.Size;

 

pt.X += left;

pt.Y += top;

sz.Height -= top + bottom;

sz.Width -= left + right;

 

// Set the bitmap object to the size of the screen

 

Bitmap bmp =

new Bitmap(

sz.Width,

sz.Height,

PixelFormat.Format32bppArgb

);

using (bmp)

{

// Create a graphics object from the bitmap

 

using (Graphics gfx = Graphics.FromImage(bmp))

{

// Take a screenshot of our window

 

gfx.CopyFromScreen(

pt.X, pt.Y, 0,0, sz,

CopyPixelOperation.SourceCopy

);

 

// Save the screenshot to the specified location

 

bmp.Save(filename, ImageFormat.Png);

}

}

}

}

}

Nel codice in rosso sono riportati il comando dell'utility che è CSS, il formato dell'immagine e le directory di salvataggio degli screenshots che sono:

c:\\main-window.png e c:\\doc-window.png

la prima directory è relativa alla finestra di AutoCAD mentre la seconda alla sua area di lavoro. Questi 3 parametri (comando, formato immagini e percorsi) possono essere modificati a piacimento.

Come compilare il codice: in questa discussione ho spiegato il procedimento e indicato il software per la compilazione del C#. In questo caso specifico, oltre ai due file ACDBMGD.DLL e ACMGD.DLL, già citati nella discussione indicata, per questa utility devono essere aggiunti altri riferimenti.

Come e quali altri riferimenti aggiungere: sempre prendendo come esempio Microsoft Visual C# 2008 Express Edition come software di compilazione, nel menù "Progetto" -> opzione "Aggiungi riferimento" -> scheda ".NET", questa volta aggiungere come riferimento anche System.Drawing e nel caso di AutoCAD 2010 probabilmente anche Presentation.Core. Anche se non citato nell'articolo (l'Autore in ogni caso ha specificato che l'approccio può subire variazioni), per il funzionamento del codice ho dovuto aggiungere anche il riferimento System.Windows.Forms, senza il quale l'utility in fase di compilazione segnalava un errore. Per il resto della compilazione e del caricamento dell'utility in AutoCAD continuare a seguire il  procedimento riportato nell'altra discussione precedentemente segnalata.

Dopo aver caricato l'utility compilata con il comando NETLOAD, dando il comando CSS (o altro comando da voi modificato) avrete la creazione in automatico dei due screenshots nella directory indicata.

Naturalmente l'utility è funzionante solo sulle ultime versioni di AutoCAD che supportano lo sviluppo di applicazioni .NET.

Potete effettuare il download del codice che ho compilato facendo click qui.

Sotto potete vedere la schermata di c:\\main-window.png

CSS main-window

e qui quella di c:\\doc-window.png

CSS doc-window

_________________

UPDATE: Kean Walmsley ha successivamente modificato CSS, creando una nuova utility più completa dal nome SCREENSHOT, di cui parlo in questo articolo.

using acApp = Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.Runtime;

using System.Drawing.Imaging;

using System.Drawing;

namespace ScreenshotTest

{

public class Commands

{

[CommandMethod("CSS")]

static public void CaptureScreenShot()

{

ScreenShotToFile(

acApp.Application.MainWindow,

"c:\\main-window.png",

0, 0, 0, 0

);

ScreenShotToFile(

acApp.Application.DocumentManager.MdiActiveDocument.Window,

"c:\\doc-window.png",

30, 26, 10, 10

);

}

private static void ScreenShotToFile(

Autodesk.AutoCAD.Windows.Window wd,

string filename,

int top, int bottom, int left, int right

)

{

Point pt = wd.Location;

Size sz = wd.Size;

pt.X += left;

pt.Y += top;

sz.Height -= top + bottom;

sz.Width -= left + right;

// Set the bitmap object to the size of the screen

Bitmap bmp =

new Bitmap(

sz.Width,

sz.Height,

PixelFormat.Format32bppArgb

);

using (bmp)

{

// Create a graphics object from the bitmap

using (Graphics gfx = Graphics.FromImage(bmp))

{

// Take a screenshot of our window

gfx.CopyFromScreen(

pt.X, pt.Y, 0,0, sz,

CopyPixelOperation.SourceCopy

);

// Save the screenshot to the specified location

bmp.Save(filename, ImageFormat.Png);

}

}

}

}

}

Tags: .Net | AutoCAD | Autodesk | Csharp | Utility

 

Come compilare codice Visual C# per AutoCAD

Attenzione: apre in una nuova finestra. PDFStampaE-mail

Scritto da CadGis Domenica 20 Settembre 2009 17:01

In questo articolo cercherò di spiegare il procedimento per la compilazione di codice in C# (C sharp) al fine di creare utility per AutoCAD.

Premessa: il C# è stato implementato nelle ultime versioni di AutoCAD e si basa sulla piattaforma .NET di Microsoft, che ha ormai abbandonato il supporto al VBA.

Per prima cosa cerchiamo di spiegare cos’è la compilazione di un codice, per chi non conosce i concetti della programmazione. Da Wikipedia: "La compilazione è il processo per cui il programma, scritto in un linguaggio di programmazione ad alto livello, viene tradotto in un codice eseguibile per mezzo di un altro programma detto appunto compilatore".

Per la scrittura e/o compilazione del C# è necessario installare quindi un programma quale Microsoft Visual C# 2008 Express Edition (c’è anche la versione in lingua italiana) che è una versione gratuita o altri software free, tipo SharpDevelop che è open source.

Io ho utilizzato Microsoft Visual C# 2008 Express Edition, riporto, quindi, il procedimento eseguito con questo programma. Aprire Microsoft Visual C# Express Edition e in "Nuovo progetto" selezionare "Libreria di classi". Nella schermata che apparirà nella scheda "Class1.cs" cancellare quella parte di codice preimpostata di default e incollare invece tutto il codice necessario per la nostra utility (non vi preoccupate se al momento vengono segnalati errori), codice che avrete precedentemente trovato in rete, oppure scritto voi.

Nel menù "Progetto" -> opzione "Aggiungi riferimento" -> scheda "Sfoglia" aggiungere come file di riferimento al progetto queste due dll di AutoCAD:

ACDBMGD.DLL e ACMGD.DLL

che troverete nella directory principale di AutoCAD stesso; a seconda dell’utility scritta vanno aggiunti spesso altri tipi di file di riferimento. Noterete che, appena aggiunti i riferimenti necessari, gli errori segnalati dopo la copia del codice sono ora scomparsi. Si può procedere a questo punto alla compilazione del codice sotto il menù "Compila", quindi, salvare il tutto.

Al salvataggio viene creata una cartella contenente diverse sottocartelle e files. Il codice compilato verrà salvato di default nella sottocartella bin\Release\ del progetto. E' possibile cambiare il percorso o visualizzare dove viene salvato attraverso la scheda "Compila" in "Proprietà NomeProgetto" presente sotto il menù "Progetto". Nella cartella bin\Release (o altra impostata da voi) troverete, oltre ad altre dll che non ci interessano, il file NomeProgetto.dll. Quest'ultimo è il frutto della nostra compilazione, il file cioè della nostra utility.

A questo punto vediamo come utilizzarla, visto che queste utility in dll non funzionano in AutoCAD con il semplice trascinamento all'interno della finestra di disegno. Sempre nelle ultime versioni di AutoCAD è stato inserito il comando NETLOAD che serve proprio per caricare le utility dll create su piattaforma .NET. Caricata la nostra utility con NETLOAD potete utilizzare il comando assegnatole nel codice per funzionare. Possiamo così utilizzare la nostra prima utility in C#.

Tags: .Net | AutoCAD | Csharp | Tutorial

 
In alto

Ultimi articoli

In alto

Cookie Policy

Questo sito utilizza alcuni tipi di cookie tecnici ed analytics unicamente per raccogliere informazioni in forma aggregata sul numero degli utenti che visitano il sito. Per saperne di più cliccare qui. Proseguendo la navigazione si acconsente all'uso dei cookie.

Feed di CadGis.it

feed-image Iscriviti al feed

Siti amici

Inchiostro e Calamaio
Sito che nasce dall'amore per la lettura e per la letteratura

Like Bee 16
Social marketing

Link consigliati

Banner

CAD3D.it
La community dei progettisti

Autodesk Webcast
Sessioni webcast, tenute da esperti Autodesk, che vengono registrate e rese disponibili per una consultazione in differita

Comandi AutoCAD: dizionario interattivo
Dizionario interattivo in diverse lingue, con possibilità di traduzione, di tutti i comandi AutoCAD

Variabili AutoCAD: dizionario interattivo
Dizionario interattivo di tutte le variabili AutoCAD

Cronologia Comandi AutoCAD
Cronologia di tutti i comandi AutoCAD dalla versione R12 alla 2013

Cronologia Variabili AutoCAD
Cronologia di tutte le variabili AutoCAD dalla versione R12 alla 2013

Openoikos
Sito per utenti di software CAD e GIS, free e open source

Chi è online

 17 visitatori online

Licenza d'uso

CadGis.it è pubblicato con Licenza Creative Commons chiamata Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia.
Significa che sei libero di utilizzare tutto il materiale che trovi nel sito a condizione che ne citi sempre la fonte.

N.B.: L'uso delle informazioni e del materiale contenuto in cadgis.it implica la totale assunzione di responsabilità da parte dell'utilizzatore.

Prêt-à-porter

Prêt-à-porter CadGis
"Storico" dei loghi creati e utilizzati da CadGis nel corso del tempo

Feed

Between the Lines
Autodesk, Design, Technology, and more blog.
  • Autodesk University 2017 Day 2
    Wednesday November 15, 2017 was action packed including a sunrise yoga option for early rising attendees that was sold out....
Lynn Allen's Blog
AutoCAD Insider
Through the Interface
  • Kuala Lumpur
    Our path to Malaysia from Cairns took us via Sydney, where we had to recheck bags and change terminal. The...
Without A Net
  • Build your AutoCAD IQ!
    You are invited to join our series of free Webinars. These are technical discussions hosted by the Autodesk Product Support...
What a Mesh
LT Unlimited
  • Quick Edit Attributes
    Ever want to just edit an attribute like you would text, without going through a dialog? Guess what? You can!...
It is Alive in the Lab

Google+

Chi segue CadGis

Facebook

In alto