Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Dynamischen Block erstellen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Dynamischen Block erstellen (2701 mal gelesen)
coLami
Mitglied



Sehen Sie sich das Profil von coLami an!   Senden Sie eine Private Message an coLami  Schreiben Sie einen Gästebucheintrag für coLami

Beiträge: 52
Registriert: 26.07.2011

AutoCad Mechanical 2011, .net 3.5 C#

erstellt am: 14. Sep. 2011 10:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Ich habe einen existierenden Block, auf den ich eine dynamische Referenz erzeugen will.
obj ist die ObjectID einer BlockTable
fname ist der Bockname

Code:

public BlockReference InsertBlock(ObjectId obj, string fname, Point3d insPt)
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
ObjectId RtnObjId = ObjectId.Null;
BlockReference bref = null;

try
{
    using (Database db = new Database(false, false))
    {
        doc.LockDocument();

        using (Transaction t = doc.TransactionManager.StartTransaction())
        {
            BlockTable table = (BlockTable)t.GetObject(obj, OpenMode.ForRead);

            if (table.Has(fname)) // Block ist vorhanden
            {
                ObjectId objid = table[fname];

                bref = new BlockReference(insPt, objid);

                BlockTableRecord record = (BlockTableRecord)t.GetObject(table[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                record.AppendEntity(bref);

                t.AddNewlyCreatedDBObject(bref, true);
// bis hierher ist bref.IsDynamicBlock = true

                t.Commit();
               
// ab hier ist es false
                doc.Editor.UpdateScreen();
            }
        }
    }
}
catch (System.Exception ex)
{
    log.Error("InsertBlock2 " + ex.Message);
}

doc.Editor.Regen();

return bref;
}


Ich möchte einen dynamischen Block erstellen, habe aber das Problem, dass dieser nach dem Commit nicht mehr dynamisch ist.
Was mach ich falsch oder bin ich total auf dem Holzweg?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

coLami
Mitglied



Sehen Sie sich das Profil von coLami an!   Senden Sie eine Private Message an coLami  Schreiben Sie einen Gästebucheintrag für coLami

Beiträge: 52
Registriert: 26.07.2011

AutoCad Mechanical 2011, .net 3.5 C#

erstellt am: 21. Dez. 2011 13:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Ich grab das hier nochmal aus, weils einen Zusammenhang mit meinem anderen Thread gibt http://ww3.cad.de/foren/ubb/Forum352/HTML/000494.shtml

Wenn ich die mysteriöse Transaction, die schon beim Start meiner Applikation unter AutoCAD exisitiert, beende, bekomme ich das hier dargestellte Verhalten.
Beende ich sie nicht, bleibt die BlockReference aus dem obigen Code dynamisch.

nur zur Information: Der Block, von dem eine Blockreferenz erzeugt wird, wird vorher mit folgendem Code geladen:

Code:

public BlockReference InsertBlock(string fileName, Point3d insPt, double angle, bool retRef)
        {
            Document doc = ACADAPP.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database destDb = doc.Database;

            BlockReference brRet = null;

            // Catch exceptions at the file level to allow skipping
            try
            {
                // Suggestion from Thorsten Meinecke...
                string destName = SymbolUtilityServices.GetSymbolNameFromPathName(fileName, "dwg");

                // And from Dan Glassman...
                destName = SymbolUtilityServices.RepairSymbolName(destName, false);

                // Create a source database to load the DWG into
                using (Database db = new Database(false, true))
                {
                    // Read the DWG into our side database
                    db.ReadDwgFile(fileName, FileShare.Read, true, "");
                    bool isAnno = db.AnnotativeDwg;

                    // Insert it into the destination database as
                    // a named block definition
                    ObjectId btrId = destDb.Insert(destName, db, false);

                    if (isAnno)
                    {
                        // If an annotative block, open the resultant BTR
                        // and set its annotative definition status
                        Transaction tr = destDb.TransactionManager.StartTransaction();
                        using (tr)
                        {
                            BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForWrite);
                            btr.Annotative = AnnotativeStates.True;
                            tr.Commit();
                        }
                    }

                    if (retRef)
                        brRet = InsertExistingBlock(destName, insPt, angle);
                }
            }
            catch (System.Exception ex)
            {
                log.Error("\nProblem importing \"" + fileName + "\": " + ex.Message + " - file skipped.");
            }

            return brRet;
        }



[Diese Nachricht wurde von coLami am 21. Dez. 2011 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz