| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: C# Blocke erstellen (2721 mal gelesen)
|
KRS Mitglied
Beiträge: 1 Registriert: 09.11.2012
|
erstellt am: 09. Nov. 2012 13:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bin neu hier und habe auch schon gleich ein Problem. Ich setze mich sein kurzem mit C# und AutoCad auseinander und versuche ein Programm zu schreiben, das etwas zeichnet und als Block in der Zeichnung abgelegt wird. Das mit dem Zeichnen bekomme ich auch schon ganz gut hin, nur leider weiß ich nicht die ich die Linien in einen Block umwandel. Hier mein Code
Code:
//PolyLinie Zeichnen public static string Polyliniezeichnen( int anzahl, int schliesen, // wenn schließen=1 dann wird die polylinie geschlossen double[] xwert, double[] ywert, int color, string linientyp ) { // Get the current document and database Document acDoc = Autodesk.AutoCAD.ApplicationServices.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 line that starts at 5,5 and ends at 12,3 //Line acLine = new Polyline(new Point2d(xstart, ystart, 0), // new Point3d(xende, yende, 0)); Polyline acPoly = new Polyline(); acPoly.SetDatabaseDefaults(); //linien Typ acPoly.Linetype = linientyp; //linien Farbe acPoly.ColorIndex = color; //Schleife die alle Punkte hinzugügt for (int i = 0; i < anzahl; i++) { acPoly.AddVertexAt(i, new Point2d(xwert[i], ywert[i]), 0, 0, 0); // Schließen the Polyline if (i == anzahl - 1 && schliesen == 1) { acPoly.Closed = true; } } // 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(); } }
Wenn Ihr einen Tipp für mich habt, wie ich die Linie in einem Block speichern kann, währe ich euch sehr dankbar. Gruß KRS Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oscarr Mitglied CAD-Manager
Beiträge: 198 Registriert: 02.10.2007 ACA 2012 - English Win 7/x64
|
erstellt am: 09. Nov. 2012 21:36 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
Guten Abend, ich weiss ja nicht wo Du das Beispiel herhast, aber ich bin mir sicher dort findest Du auch ein passendes zum erstellen von Blöcken . Falls nicht hier ist eins von Kean: Creating an AutoCAD block using .NET Du solltest Dir unbedingt die Struktur einer DWG genauer anschauen. Vor allem das Thema BlockTables ist existenziell für AutoCAD Programierung. Du hast ja schon in einen Block hinein gezeichnet. Formal gesehen gibt es in einer DWG nur Blöcke, der Modelbereich ist einer, jedes Layout auch. Und alle Blöcke können sowohl Geometrien u.ä. enthalten und eben auch weitere Blöcke. Du hast Sie ja schon mittels acBlkTblRec.AppendEntity(acPoly); in einen Block geschrieben. Wichtig zu wissen ist das man einen Block nicht "sehen" kann. Den Block mit all seinen Objekten definert man in der BlockTable als BlockTalbleRecord. Wenn man ihn "sehen" will, muss man in dem Block in dem er erscheinen soll (zB. Modelspace) eine BlockReference in jenen einfügen. Die Grafiken hier illustrieren das recht gut. Viel erfolg weiterhin Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Nov. 2012 22:36 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
Zitat: Original erstellt von KRS: ... das etwas zeichnet und als Block in der Zeichnung abgelegt wird. Das mit dem Zeichnen bekomme ich auch schon ganz gut hin, nur leider weiß ich nicht die ich die Linien in einen Block umwandel. ...
Du bist doch beim Programmieren und nicht beim Zeichnen. Das ist eine grundverschiedene Herangehensweise., wo nur das Ergebnis gleich ist. Daher solltest du den Hinweis meines Vorredners ernst nehmen und dich mit dem Aufbau einer Zeichnungsdatenbank beschäftigen. Beim Programmieren schreibst du lediglich Daten direkt in diese hinein, da ist es vollkommen unerheblich, welche Befehle das AutoCAD Frontend zur Verfügung stellt. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 10. Aug. 2017 10:40 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist! - bin erst jetzt am Testen Hallo! Das Problem, welches ich habe ist. Ich möchte noch ein Attribut in den Block legen. Hier mein Ansatz Nur verstehe ich nicht ganz, weshalb ich den Aufruf mit Attsync bewerkstelligen muss, um das Attribut am Block sichtbar zu machen. Gehe ich falsch heran an die Aufgabe, einen Block mit einem Attribut zu erzeugen ? Bin im Netz nicht richtig fündig geworden. Nach meinem bisherigen Verständnis muss ich folgendermassen vorgehen. 1) BlockTable der Zeichnung lesen 2) BlockTableRecord für einen neuen Block erzeugen 3) Den Inhalt des Blockes bestimmen (Keans Beispiel) ein Quadrat aus Linien Damit ist der Block in der Zeichnungdatenbank Fortsetzung mit dem Attribut 4) AttributeDefinition erzeugen und mit append an den Block "heften" 5) Einfügen des Blocks in den Modelbereich Und jetzt die Frage, wie mache ich das Attribut sichtbar - mein Behelf mit attsync ??? ------------------ Gruss Dirk Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 10. Aug. 2017 10:45 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 10. Aug. 2017 10:46 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist! Wenn du einen Block einfügst, musst du die Attribute aus der Blockdefinition ermitteln und diese dann als AttributeReference an die erzeugte Blockreference anfügen. Ist einfach so. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 10. Aug. 2017 11:10 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
Eigenartiges Verhalten! Nur nochmal, damit ich das richtig verstehe. Den Block mit Attribut habe ich in die Zeichendatenbank eingefügt. Will ich den Block in den Modelbereich einfügen, muss ich quasi für die Attribute eine Attributreferenz einfügen ?! ------------------ Gruss Dirk Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 10. Aug. 2017 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
|
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 10. Aug. 2017 11:17 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
"Den Block mit Attribut habe ich in die Zeichendatenbank eingefügt." Nein, du hast eine Blockdefinition erstellt(eingefügt) welche AttributDEFINITIONEN beinhaltet. Beim erstellen von Blockreferenzen hast du dich selbst darum zu kümmern nachzusehen ob es in der Blockdefinition Attributdefinitionen gibt, welche NICHT-KONSTANT sind. Diese Attributedefinition sind Vorlage für Attribute, welche an Blockreferenzen hängen. Die Blockreferenz visualisiert dann die gesamt (sichtbare) Geometrie der Blockdefinition, AUSSER die enthaltenen Attributdefinitionen welche NICHT als Konstant deklariert sind. Es gibt keinerlei direkter Verbindung zwischen Block(definition) und einem Attribut an einer Blockreferenz. So ist es mit Blöcken (und Attributen) immer wieder gerne aus User-Sicht: FAQ: Blöcke ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 10. Aug. 2017 12:00 <-- editieren / zitieren --> Unities abgeben: Nur für KRS
|