| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: einfache Line erstellen / simple line (1478 mal gelesen)
|
THE_ONE Mitglied Student, Alter:23
Beiträge: 299 Registriert: 27.04.2005 AMD XP 2000, 512MB-RAM, WIN XP Pro Readon 9600Pro VIZ 2005, Autocad 2005
|
erstellt am: 13. Dez. 2006 00:20 <-- editieren / zitieren --> Unities abgeben:
Hi! Bin absoluter Newbie was ARX betrifft und schaffe es einfach nicht eine Kreis auf den Bildschirm zu bekommen. (Hab bis jetzt Tut 1-3 durchgemacht) Ha dazu mal folgendes getippt: Code: const ACHAR de = ACHAR("0"); AcDbCircle *pCircle =new AcDbCircle (AcGePoint3d::kOrigin, AcGeVector3d::kZAxis, 1.0); pCircle->setColorIndex (2) ; pCircle->setLayer(&de); pCircle->close();
kompilieren und ausführen lässt es sich nur sehen tu ich nichts am Bildschirm!Wenn dieser Kreis zu einer Blockdefinition gehören würde müsste ich jetzt das Objekt Kreis (pCircle) zu pBlockTableRecord hinzufügen durch Verwendung von Code: pBlockTableRecord->appendAcDbEntity (pCircle))
Was mache ich aber wenn ich dieses Objetkt einfach in die aktuelle Zeichnung einfügen will, muss ich dieses Objekt auch irgendwie irgendwo hinzufügen?? Hoffe ihr könnt mir weiterhelfen. MFG THE_ONE Ps.:Weiß jemand ob es ein Makro gibt für den aktuellen Layer. Will ja nicht immer auf Layer 0 zeichnen. wie komm ich zum aktuellen layer, damit das gezeichnete immer am aktuellen Layer liegt. ich stell mir sowas wie pCircle->setLayer("aktueller_Layer"); Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
criecky Mitglied MENSCH
Beiträge: 251 Registriert: 13.01.2004 ACAD 2011- 2017 www.cbyte.eu
|
erstellt am: 13. Dez. 2006 03:39 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
hallo, du solltest die AcDbBlockTable nicht nur mit dem Autocadbefehl: block vergleichen..... schaue dir mal die SymbolTabeles an. Und vergesse den Acad Befehl: block ! Die AutoCAD Datenbank enthält die folgenden Symboltabellen: • Block table (AcDbBlockTable; BLOCK) ( auch der modellbereich zählt dazu) • Layer table (AcDbLayerTable; LAYER) • Text style table (AcDbTextStyleTable; STYLE) • Linetype table (AcDbLinetypeTable; LTYPE) • View table (AcDbViewTable; VIEW) • UCS table (AcDbUCSTable; UCS) • Viewport table (AcDbViewportTable; VPORT) • Registered applications table (AcDbRegAppTable) • Dimension styles table (AcDbDimStyleTable; DIMSTYLE) mal ein beispiel ohne fehlerprüfung … nur zur anregung
Code: // ****** code for mycircle *********** AcDbObjectId createCircle() // Kreisfunktion { AcGePoint3d centerPoint; double radius; acedGetPoint(NULL, "\nZentrumspunkt zeigen: ", asDblArray(centerPoint)); // mit Hilfsarray wegen ADS-Punkt AcGeVector3d normal(0.0, 0.0, 1.0); acedGetDist(asDblArray(centerPoint),"\nRadius angeben: ", &radius); AcDbCircle *pCirc = new AcDbCircle(centerPoint, normal, radius); // für Zugriff Modellbereich AcDbBlockTable *pBlockTable=NULL; // aktuelle Datenbank (Zeichnung) nur zum lesen acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord; // in BlockTable den Modellbereich (ModelSpace -> Makro) // öffnen zum schreiben; pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); pBlockTable->close(); //Wir haben ja den Modellbereich AcDbObjectId circleId; // über Zeiger vom Modellbereich kreis in datenbank einfügen pBlockTableRecord->appendAcDbEntity(circleId, pCirc); pBlockTableRecord->close(); //Modellbereich schliessen pCirc->close(); //Entity schliesen }
zum layer: du kannst die CLAYER Systemvariable abfragen über acedGetVar() gruss criecky ------------------ Softlan macht das Netzwerk weich! www.cbyte.de [Diese Nachricht wurde von criecky am 13. Dez. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
THE_ONE Mitglied Student, Alter:23
Beiträge: 299 Registriert: 27.04.2005 AMD XP 2000, 512MB-RAM, WIN XP Pro Readon 9600Pro VIZ 2005, Autocad 2005
|
erstellt am: 13. Dez. 2006 10:43 <-- editieren / zitieren --> Unities abgeben:
Hi! Erstmal besten Dank, hat wunderbar funktioniert (dafür gibts 10 Unities)! Habe noch ein paar fragen: 1. was ist der Unterschied bzw. wie arbeiten die SymbolTables und die SymbolTableRecords zusammen. 2. Code: // aktuelle Datenbank (Zeichnung) nur zum lesen acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
warum öffne ich die aktuelle Zeichnung nur zum lesen obwohl ich ja was reinschreibe?3.WO sehe ich was alles noch in den Symboltables ist?? von wo weiß ich was wo drinnen ist?? in der classmap von ACAD sehe ich ja nur welche es gibt. Gewisse Sachen sind ja intuitive (glaub ich zumindest). z.B.: Einen Layer fügt man zur AcDbLayerTable. Einen Block zur AcDbBlockTable (nur wie man gesehen hat nicht nur Blöcke sondern mehr), nur von wo weiss ich jetzt das da auch der Modellbereich drinnen liegt? Wenn ich jetzt auf ein bestimmtes Layout zugreifen müsste wäre dann das auch dort zu finden?? MFG THE_ONE Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
criecky Mitglied MENSCH
Beiträge: 251 Registriert: 13.01.2004 ACAD 2011- 2017 www.cbyte.eu
|
erstellt am: 13. Dez. 2006 11:37 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
Hallo THE_ONE ! Zu 1. acad verwaltet alles in einer Datenbank , die einzelne container beinhalte. wie eine konventionelle datenbank, besteht die zeichnung aus einer tabelle mit datensätzen (zeilen) und datenfeldern (spalten). objekte einer zeichnungsdatenbank können alle vorstellbaren objekte sein. jedoch sind die objekte, je nach ihren eigenschaften, in bestimmte vorgegebene container untergebracht. Dabei sind alle objekte, die keine graphische darstellungen besitzen in den so genannten symboltabellen zusammengefasst. in acad 2004 gibt z.b. 9 Symboltabellen: • Bemaßungsstiltabelle • Layertabelle • Blocktabelle • Linientyptabelle • Textstiltabelle • Ansichtfenster- und Ausschnitttabelle • Tabelle der Koordinatensysteme • Tabelle der registrierten Applikationen • Tabelle Benutzerkoordinatensysteme schau dir mal die klassenliste unter classmap im sdk an. dann kannst du es bessser verstehen. ??? die blocktabelle hat eine besondere stellung unter den symboltabellen. sie enthält alle block-container, die wiederum sämtliche objekte mit graphischer darstellung verwalten. Alle datensätze in den symboltabellen müssen vom gleichen typ sein. Da aber innerhalb einer zeichnungsdatenbank eine vielzahl unterschiedlicher objekte verwaltet werden müssen, gibt es ein flexiblerer container. dieser container wird dictionary genannt, die datensätze eines dictionary werden als RECORDS bezeichnet. da du ja nur eine gewisse anzahl von objekten erzeugen oder manipulieren möchtest erhältst du über die einzelnen records zugriff auf die elemente. alles klar? frage ruhig !!! zu 2. jedes objekt hat in der datenbank eine eindeutig identifizierung, diese ändert sich während der gesamten lebensdauer des objekts nicht. darum musst du dich aber erst mal nicht kümmern. du brauchst nur diese identifizierung um das objekt zu verändern. du möchtest ja nicht die ganze datenbank neu beschreiben. als reicht ein lesen der zeichung aus. es gibt dafür aber wie immer mehrere varianten. du willst aber ja nur in den modellbereich etwas einfügen (oder Papierbereich). deshalb brauchst du eine zeiger auf den modellbereich von einer beliebigen zeichnung. zu 3: der classmap stellt dir einen überblick und verbindungen der einzelnen container dar. wobei eigentlich für den anfang alle die mit AcDb beginnen ausreichen dürften. genauer erläuterungen zu den einzelnen klassen und deren objekt findest du in der docs der sdk. wenn du jetzt nachschaust wirst z.b du die klasse AcDbLayout und AcApLayoutManager finden. kannst dir nur zum verständnis auch mal in der acad hilfe das objektmodell von vba anschauen. Tip: http://arxdummies.blogspot.com/ ist auch für den anfang ganz gut. viel spass und nicht aufgeben. das wird. gruss criecky ------------------ Softlan macht das Netzwerk weich! www.cbyte.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
THE_ONE Mitglied Student, Alter:23
Beiträge: 299 Registriert: 27.04.2005 AMD XP 2000, 512MB-RAM, WIN XP Pro Readon 9600Pro VIZ 2005, Autocad 2005
|
erstellt am: 14. Dez. 2006 00:29 <-- editieren / zitieren --> Unities abgeben:
Hallo! Bin auf ein neues Problem gestoßen und irgendwie finde ich dazu nix! Was ist/sind AcDbSystemInternals. Diese muss ich nämlich angeben um eine Spline zu zeichnen das selbe muss ich auch angeben wenn ich einen Mtext einfügen möchte(zumindest schreibt mir das das VStudio 2005 hin)! Das was mich jetzt mal interessieren würde bezieht sich auf die Spline! Hab bisher eine Forschleife in der ich ca.: 100 Werte einer Funktion berechne (z.B Sinunsfunktion)und jetzt würde ich gerne das ganze auf den Bildschirm zeichnen mit Hilfe einer spline wie füttere ich diese? MFG THE_ONE Habs grad geschafft!! Hab in der Hilfe nachgeschaut und da steht das man die Funktion Spline wie folgt aufruft:
Code: AcDbSpline(const AcGePoint3dArray& points, const AcGeVector3d& startTangent, const AcGeVector3d& endTangent, int order = 4, double fitTolerance = 0.0);
Nun frag ich mich was es mit dem AcDbSystemInternals auf sich hat.Ist das ein Fehler vom VS2005?? Aber mal für alle die eine Spline zeichnen wollen hier der Code:
Code: AcGePoint3dArray sp_ar; const AcGeVector3d start_vec = AcGeVector3d(0,0,0); const AcGeVector3d end_vec = AcGeVector3d(0,0,0); AcGePoint3d spt1 = AcGePoint3d(0,0,0); AcGePoint3d spt2 = AcGePoint3d(1,1,0); AcGePoint3d spt3 = AcGePoint3d(2,0,0); AcGePoint3d spt4 = AcGePoint3d(3,1,0); AcGePoint3d spt5 = AcGePoint3d(4,0,0); sp_ar.append(spt1); sp_ar.append(spt2); sp_ar.append(spt3); sp_ar.append(spt4); sp_ar.append(spt5); AcDbSpline *pSpline = new AcDbSpline(sp_ar,start_vec,end_vec,3,0.0); pSpline->setColorIndex (3); pBlockTableRecord->appendAcDbEntity(lineId, pSpline); pSpline->close();
Frage an die Profis kann man das schöner machen?? mir gefällt nicht das ich für jeden Arrayeintrag einen neuen Punkt erzeugen muss, muss ich das überhaupt?? Kann ich vielleicht einfach nur einen Punkt nehmen und ihm einfach nach jedem append einfach einen neuen Wert zuweisen? MFG THE_ONE [Diese Nachricht wurde von THE_ONE am 14. Dez. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
criecky Mitglied MENSCH
Beiträge: 251 Registriert: 13.01.2004 ACAD 2011- 2017 www.cbyte.eu
|
erstellt am: 14. Dez. 2006 12:59 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
hi, vielleicht so:
Code:
AcGePoint3d temppoint; while (abruchbedingung) // z.b rtnorm { double x,y,z; x=0; y=0; z=0; // hier mit werten füttern temppoint.set(x,y,z); sp_ar.append(temppoint); }
gruss criecky ------------------ Softlan macht das Netzwerk weich! www.cbyte.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| IT-Administrator CATIA/Cadence (m/w/d) | Behr-Hella Thermocontrol GmbH (BHTC) ist mit über 2.800 Mitarbeitern weltweit eines der führenden Unternehmen im Bereich Klimabedienung, Thermomanagement und HMI für die Automobilindustrie. BHTC bildet das gesamte Spektrum von der Konzeption über die Entwicklung bis hin zur Produktion innovativer Lösungen in den Segmenten Bediensysteme, Klimabedien- und Klimasteuergeräte, Center Information Displays und integrierte Centerstacks ab.... | Anzeige ansehen | Systemadministration, Netzwerkadministration |
|
THE_ONE Mitglied Student, Alter:23
Beiträge: 299 Registriert: 27.04.2005 AMD XP 2000, 512MB-RAM, WIN XP Pro Readon 9600Pro VIZ 2005, Autocad 2005
|
erstellt am: 17. Dez. 2006 22:30 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|