Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Blockreferenz löschen

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:  Blockreferenz löschen (5066 mal gelesen)
Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 07. Jul. 2009 13:28    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

Hallo Zusammen,

folgendes Problem ich erstelle eine Blockreferenz mit dieser Zeile:

Blockref = New BlockReference(New Autodesk.AutoCAD.Geometry.Point3d(Koordinate), BlkId)

funktioniert alles wunderbar aber wie kann ich diese wieder löschen?
In VBA gings einfach mit:

Blockref.Delete

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 07. Jul. 2009 13:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

mit obiger Zeile hast Du nur eine Instanz einer BlockReference in Deinem Speicher erzeugt, da passiert mal gar nix in der Zeichnung, solange Du diese nicht:

a) einem Modellbereich oder einer Blockdefinition hinzufügst

b) das ganze auch der aktuellen TransAction mitteilst

D.h. Du musst eingentlich in dem Fall, wo diese BlockReference nirgens eingefügt ist, nur mehr das ganze aus dem Speicher vertschüssen:

BlockRef.Dispose

Und den Rest überlässt Du dem GarbageCollector, der sich der Sache mit der entgültigen Speicherbereinigung dann annimmt.

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 07. Jul. 2009 13:46    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

Hallo Alfred,

ich hab zu wenig Code kopiert (sorry mein Fehler   )
Programmiert in VB.Net
-------------------------------------------------------------------------------------------------------------
blockref= New BlockReference(New Autodesk.AutoCAD.Geometry.Point3d(Koordinate), BlkId)
BTRecord.AppendEntity(blockref)
Transaction.AddNewlyCreatedDBObject(blockref, True)
blockref.ExplodeToOwnerSpace()
blockref.Erase()
Transaction.Commit()
Document.Editor.UpdateScreen()
-------------------------------------------------------------------------------------------------------------

Und jetzt möchte ich diese Blockref wieder löschen weiß aber nicht wie.

Grüße

Silvan

[Diese Nachricht wurde von Silvan01 am 07. Jul. 2009 editiert.]

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


Ex-Mitglied

erstellt am: 07. Jul. 2009 13:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Silvan,

mit '.Erase' muss er doch schon fort sein, oder? Ist die BlockReference wirklich noch da oder siehst Du ev. nurmehr die explodierten Elemente?

Allerdings sehe ich auch einen kleinen Umweg, den Du da gehst, denn Hinzufügen einer BlockReference zum Modellbereich, dann wieder löschen ==> Zeit/Performance 

Ich verwende in diesem Fall:

Code:
Dim tExpEnts As DatabaseServices.DBObjectCollection = New DatabaseServices.DBObjectCollection
Call BlRef.Explode(tExpEnts)
If (tExpEnts IsNot Nothing) AndAlso (tExpEnts.Count > 0) Then
  'und da fuege ich dann die resultierenden Elemente aus dem 'explode' in den Bereich, in dem ich's brauche

HTH, - alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 07. Jul. 2009 16:32    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

Hallo Alfred,

ich lasse zuerst den Benutzer einen Ordner wählen, in dem seine Dwg-Zeichnungen (mit jeweils einem Block) sind.
Danach will ich jede DWG öffnen und den enthaltenen Block platzieren um Abmaße des Blocks zu bekommen, danach wird dieser wieder gelöscht. (Ein Init Fall sozusagen).
Die Blöcke werden im Verlauf des Programms nochmal häufiger platziert!
so sieht die Funktion bis jetzt aus:
---------------------------------------------------------------------------------------------------------------
    Public Sub Init_Block(ByVal Koordinate() As Double, ByVal Path As String)
       
        Try
            dwgName = HostApplicationServices.Current.FindFile(Path, acadAppl.DocumentManager.MdiActiveDocument.Database, FindFileHint.Default)
           
            Database.ReadDwgFile(dwgName, IO.FileShare.None, True, "")
            BlkId = Document.Database.Insert(dwgName, Database, False)
            BTable = TryCast(Transaction.GetObject(Document.Database.BlockTableId, OpenMode.ForRead, True), BlockTable)
            If BTable = Nothing Then
                Exit Try
            End If
            BTRecord = TryCast(Transaction.GetObject(BTable(BTRecord.ModelSpace), OpenMode.ForWrite, True), BlockTableRecord)
            If BTable = Nothing Then
                Exit Try
            End If
            Block = New BlockReference(New Autodesk.AutoCAD.Geometry.Point3d(Koordinate), BlkId)
            BTRecord.AppendEntity(Block)
            Transaction.AddNewlyCreatedDBObject(Block, True)
            Block.ExplodeToOwnerSpace()
            Transaction.Commit()
            Document.Editor.UpdateScreen()
        Catch ex As Autodesk.AutoCAD.Runtime.Exception
            Editor.WriteMessage(ex.ToString)
        End Try
---------------------------------------------------------------------------------------------------------------

Hab mir das Zeug mal von hier zusammengebastelt.

Der erste Block wird eingefügt beim Zweiten allerdings erscheint die Catch Meldung: Autodesk.AutoCAD.Runtime.Exception: eRepeatedDwgRead
   bei Autodesk.AutoCAD.DatabaseServices.Database.ReadDwgFile(String fileName,
FileShare fileSharing, Boolean allowCPConversion, String password)
   bei TEST.Funktionen.Init_Block(Double[] Koordinate, String
Path) in D:\TEST\Funktionen.vb:Zeile 219.

Also hab ich eigentlich zwei Fragen:
Warum wird beim 2. Aufruf der Funktion kein Block platziert?
Wie bau ich am besten das Löschen des Blocks ein?

Grüße und Danke für die Hilfe!

Silvan

[Diese Nachricht wurde von Silvan01 am 08. Jul. 2009 editiert.]

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


Ex-Mitglied

erstellt am: 07. Jul. 2009 17:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Silvan,

bitte Vorsicht mit Variablennamen, wenn Du Variable so benennst wie Objekte oder Funktionen, dann bekommst Du einen fürchterlich   lesbaren Code. Z.B. die Zeile:

BlkId = Document.Database.Insert(dwgName, Database, False)

kann man in Deinem Beispiel nur schwer erahnen, dass offensichtlich 'Document' für ein DocumentObject ist, und ich kann nur vermuten, dass es sich dabei um Deine aktuelle Zeichnung handelt? (Gleichzeitig gibts es aber schon den Begriff 'Document' mehrfach in diversen Assemblys)

Mehrmaliges lesen einer Database:

Database.ReadDwgFile(dwgName, IO.FileShare.None, True, "")

(auch hier wieder: 'Database' gibt es in den Standard-Assemblies schon definiert, worum es sich hier handelt, kann ich schon gar nicht mehr sagen, weil ich nicht weiss, wo Du's wie deklariert hast)
Da kann ich nur vermuten, dass Du den Lesemodus dieses Objekt nicht zurücksetzt, aber ein zweites mal öffnen versuchst, obwohl's schon offen ist. Ein temporäres Database-Objekt muss auch wieder ordnungsgemäß geschlossen werden!!

Code:
Dim tDB As Database = New Database(False, True)
Try
  tBlTabRecID = AcadDoc.Database.Insert(tBlName, tDB, False)  'ergibt ObjectID des BlockTableRecords
Catch ex As Exception
  'fehlerausgabe
End Try
If tDB IsNot Nothing Then tDB.CloseInput(True) : tDB.Dispose() : tDB = Nothing

Also obiger Code schliesst nach Einlesen eines DWG's in den Speicher den Lesevorgang und auch die Datenbank wieder

Zitat:
Wie bau ich am besten das Löschen des Blocks ein?

Meinst Du jetzt das Löschen der BlockReference oder das Löschen der Blockdefinition?

Das Löschen der BlockReference wäre ja zuerst schon besprochen, da war meine Frage, ob diese trotzdem im Modelspace zu sehen/selektieren ist.

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 08. Jul. 2009 08:39    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

Hallo Alfred,

so die Variablennamen hab ich geändert.
Der Block ist im Modelspace zu sehen/selektieren. Wie bekomm ich den da weg?

Noch eine weitere Frage zwecks der Database da hab ich noch meine Probleme.
Ich würde vermuten, dass es sinnvoll wäre im Init-Fall die Zeichnungen einmal in die
Datenbank zu schreiben und bei jeder weiteren Platzierung des Blocks immer auf diese zuzugreifen?

Momentan jedoch mach ich bei meinem Programm die Datenbank im Init-Fall jedesmal neu schreib die Zeichnung rein und leere sie am Ende. Das würde heißen ich müsste bei jeder weiteren Platzierung immer eine neue Datenbank anlegen Zeichnung jedes mal aufs neue öffnen usw.
Wie kann ich das am besten verhindern?

Mein Code sieht jetzt folgendermaßen aus:
--------------------------------------------------------------------------------------------------------------
    Public Doc As Document
    Public Edi As Editor
    Public dwgName As String
    Public BlkId As ObjectId
    Public BTable As BlockTable
    Public BTRecord As BlockTableRecord

    Doc = acadAppl.DocumentManager.MdiActiveDocument
    Edi = Doc.Editor

Public Sub Init_Block(ByVal Koordinate() As Double, ByVal Path as String)

        Dim DB As Database = New Database(False, True)
        Dim Taction As Transaction = Doc.TransactionManager.StartTransaction

        Try

            dwgName = HostApplicationServices.Current.FindFile(Path, acadAppl.DocumentManager.MdiActiveDocument.Database, FindFileHint.Default)
            DB.ReadDwgFile(dwgName, IO.FileShare.None, True, "")
            BlkId = Doc.Database.Insert(dwgName, DB, False)
            BTable = TryCast(Taction.GetObject(Doc.Database.BlockTableId, OpenMode.ForRead, True), BlockTable)
            If BTable = Nothing Then
                Exit Try
            End If
            BTRecord = TryCast(Taction.GetObject(BTable(BTRecord.ModelSpace), OpenMode.ForWrite, True), BlockTableRecord)
            If BTable = Nothing Then
                Exit Try
            End If
            MsgBox(BlkId.ToString)
            Block = New BlockReference(New Autodesk.AutoCAD.Geometry.Point3d(Koordinate), BlkId)
            BTRecord.AppendEntity(Block)
            Taction.AddNewlyCreatedDBObject(Block, True)
            Block.ExplodeToOwnerSpace()
            Block.Erase()
            Taction.Commit()
            Taction.Dispose()
            Doc.Editor.UpdateScreen()
            If DB IsNot Nothing Then DB.CloseInput(True) : DB.Dispose() : DB = Nothing
        Catch ex As Autodesk.AutoCAD.Runtime.Exception
            Edi.WriteMessage(ex.ToString)

        End Try

    End Sub
------------------------------------------------------------------------------------------------------------

Grüße

Silvan

[Diese Nachricht wurde von Silvan01 am 08. Jul. 2009 editiert.]

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


Ex-Mitglied

erstellt am: 08. Jul. 2009 17:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Silvan,

was auch immer ich tue, bei mir bleibt die eingefügte Zeichnung, die dann explodiert wird, nicht als BlockReference im Modellbereich erhalten.

D.h. bekommst mal den Code, wie ich ihn für mich konvertiert habe, und als zweites noch eine Idee: kann es sein, dass in der Zeichnung, die du einfügst, bereits der gesamte Modellbereich zu einem Block zusammengefasst ist? Also z.B. Du hast eine Zeichnung 'TEST' (so heisst ja alles in der EDV), in dieser ist im Modellbereich ein Block 'Tisch' eingesetzt.
Jetzt kommt Dein Programm dran, fügt in der aktuellen Zeichnung obige ein, damit hast Du als erstes mal in der aktuellen Zeichnung einen Block 'Test' ==> dieser wird dann explodiert, damit bleibt dann der Block 'Tisch' im Modellbereich bestehen. Kann's das sein?

Mein Code:

Code:
  Public Shared Sub CADde_temp()
      Dim tAcadDoc As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument
      Dim tTrAct As Transaction = Nothing
      Dim tBtr As BlockTable = Nothing
      Dim tModSp As BlockTableRecord = Nothing
      Dim tDB As Database = Nothing

      Try
        tTrAct = tAcadDoc.TransactionManager.StartTransaction
        tBtr = CType(tTrAct.GetObject(tAcadDoc.Database.BlockTableId, OpenMode.ForRead, True, True), BlockTable)
        tModSp = CType(tTrAct.GetObject(tBtr(DatabaseServices.BlockTableRecord.ModelSpace), OpenMode.ForWrite, True, True), BlockTableRecord)

        tDB = New Database(False, True)

        Dim tDwgName As String = "C:\TEMP\OoC_OEKK_TestObjects_AN03.dwg"
        tDB.ReadDwgFile(tDwgName, IO.FileShare.None, True, "")

        Dim tBlkId As ObjectId = tAcadDoc.Database.Insert(tDwgName, tDB, False)
        MsgBox(tBlkId.ToString)
        Dim tBlockRef As BlockReference = New BlockReference(New Autodesk.AutoCAD.Geometry.Point3d(0, 0, 0), tBlkId)
        tModSp.AppendEntity(tBlockRef)
        tTrAct.AddNewlyCreatedDBObject(tBlockRef, True)
        tBlockRef.ExplodeToOwnerSpace()
        tBlockRef.Erase()
        tTrAct.Commit()
        tTrAct.Dispose()
        tAcadDoc.Editor.UpdateScreen()

        tTrAct.Commit()
      Catch ex As Exception
        tAcadDoc.Editor.WriteMessage(ex.ToString)
      Finally
        If tTrAct IsNot Nothing Then tTrAct.Dispose() : tTrAct = Nothing
        If tDB IsNot Nothing Then tDB.CloseInput(True) : tDB.Dispose() : tDB = Nothing
      End Try
  End Sub



Du solltest auch darauf achten, dass Du die Datenbank IN JEDEM FALL wieder schliesst (aus der Du einfügst), in Deinem Beispiel wird diese nur geschlossen, wenn der Rest des Codes ohne Fehler durchkommt, zischt Dein Prog in die Exception ab, dann bleibt Dir auch die DB offen.

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 09. Jul. 2009 11:47    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

Hallo Alfred,

ja du hast recht kann ich das verhindern?
Bzw. wäre es Möglich statt die Zeichnung als Block einzufügen den Block aus der Zeichnung einzufügen?
Ich habe deine Funktion eingefügt aber bei der Zeile:

BTable = CType(Taction.GetObject(Doc.Database.BlockTableId, OpenMode.ForRead, True, True), BlockTable)

springt er zu catch. Es wird also kein Block platziert.

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 09. Jul. 2009 13:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Silvan,
Zitat:
ja du hast recht kann ich das verhindern?
...womit hab ich denn recht? Auf welche der obigen Aussagen bezieht sich das?

Zitat:
Ich habe deine Funktion eingefügt aber bei der Zeile .... springt er zu catch.
...dann mach bitte einen BreakPoint und schau Dir der Reihe nach an, ob die Objekte definiert sind, also zuerst 'Doc' markieren ==> rechte Maustaste ==> Schnellüberwachung; wenn das nicht auf <Nothing> steht, dann darin auf Database ==> BlocktableID ansehen, ob die Eigenschaft 'isValid' auf TRUE steht.

Und last but not least, wenn er ins 'catch' hineinfliegt, was meldet dann 'ex', welche Meldung kommt als Fehlerbeschreibung?

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 09. Jul. 2009 13:48    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

Hallo Alfred,

mit du hattest recht meinte ich folgendes:
D.h. bekommst mal den Code, wie ich ihn für mich konvertiert habe, und als zweites noch eine Idee: kann es sein, dass in der Zeichnung, die du einfügst, bereits der gesamte Modellbereich zu einem Block zusammengefasst ist? Also z.B. Du hast eine Zeichnung 'TEST' (so heisst ja alles in der EDV), in dieser ist im Modellbereich ein Block 'Tisch' eingesetzt.
Jetzt kommt Dein Programm dran, fügt in der aktuellen Zeichnung obige ein, damit hast Du als erstes mal in der aktuellen Zeichnung einen Block 'Test' ==> dieser wird dann explodiert, damit bleibt dann der Block 'Tisch' im Modellbereich bestehen. Kann's das sein?
wie kann ich das verhindern bzw. wie kann ich den einzelnen Block aus dieser Zeichnung bekommen und nur den platzieren?

Gibt es ne möglichkeit mit Visual Studio und AutoCAD genauso zu arbeiten wie mit VBA?
Ich kann meine Klassenbibliothek in Vb.Net ja nicht so einfach ausführen und überwachen mit Breakpoints.

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 09. Jul. 2009 13:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

Wenn Du (um bei meinem Beispiel zu bleiben) die Zeichnung TEST einfügst, dann mit '.Explode' einem zerlegst, dann hast Du ja die Elemente (BlockReference 'Tisch') auch in der Hand, diese ein zweites mal 'zu behandeln'. Andere Variante, wie Du Elemente von einer Zeichnung in die andere bekommst, geht über 'WBlockClode' (oder such zumindest mal nach 'WBLOCK', ich hab's jetzt nicht auswendig im Kopf), damit kannst Du elementweise von einer Datenbank in die andere kopieren.

Zitat:
Ich kann meine Klassenbibliothek in Vb.Net ja nicht so einfach ausführen und überwachen mit Breakpoints
....oops, wie hast Du denn bisher gearbeitet?

Du hast Deinen Source im VS, in den Eigenschaften Deines (Haupt-)Projekts stellst Du unter 'debuggen' ein, dass Du AutoCAD starten willst, im Arbeitsverzeichnis stellst Du <Installationsverzeichnis von AutoCAD>\UserDataCache ein. Dann klickst im VS auf den 'PLAY'-Button (debuggen starten heisst's glaub ich im PullDown) ==> Dein AutoCAD wird gestartet, mit '_netload' lädst Du Deine DLL und überall, wo Du einen BreakPoint gesetzt hast, wird VS stehen bleiben.

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 05. Aug. 2009 10:42    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

Hallo,

so nach längerer Zeit bin ich jetzt wieder zu dem Projekt gekommen und habe wegen einiger Probleme mir dieses Beispiel angesehen.
Der Block der externen Zeichnung wird eingefügt und ich kann auch dessen Abmaße abfragen, doch wenn ich ihn mit .Erase() löschen will (Nur von der Zeichenoberfläche) bekomme ich eine Fehlermeldung.

Mein Code sieht folgender Maßen aus:
------------------------------------------------------------------------------------------------------------
Option Explicit On
Imports System
Imports System.Type
Imports System.Collections.Generic
Imports System.Text
Imports System.IO
Imports System.Windows.Forms

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Internal
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry

Public Module Funktionen
    Public Doc As Document
    Public Edi As Editor
    Public DB As Database
    Public blockref As BlockReference

    Public Sub Init_Block(ByVal Blockpath, ByVal Punkt As Point3d)

        Using xDb As New Database(False, True)
            xDb.ReadDwgFile(Blockpath, FileShare.Read, True, Nothing)

            Using Tr As Transaction = Doc.TransactionManager.StartTransaction()

                'Local variables
                Dim Name As String = SymbolUtilityServices.GetBlockNameFromInsertPathName(Blockpath)
                Dim ID As ObjectId = DB.Insert(Name, xDb, True)

                If ID.IsNull Then
                    Edi.WriteMessage(vbLf & "Failed to insert block")
                    Exit Sub
                End If

                'for inserting an annotative dwg
                If xDb.AnnotativeDwg Then
                    Using BTRAnnotative As BlockTableRecord = DirectCast(Tr.GetObject(ID, OpenMode.ForWrite), BlockTableRecord)
                        BTRAnnotative.Annotative = AnnotativeStates.[True]
                    End Using
                End If

                Dim CurrSpace As BlockTableRecord = TryCast(Tr.GetObject(DB.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
                Blockref = New BlockReference(Punkt, ID)
                CurrSpace.AppendEntity(blockref)
                blockref.SetDatabaseDefaults()

                'for inserting an annotative dwg
                If xDb.AnnotativeDwg Then
                    'Attach current annotation-scale
                    'If you don't add the content, the block and the following attribut will not inserted correct
                    Dim OCM As ObjectContextManager = DB.ObjectContextManager
                    Dim OCC As ObjectContextCollection = OCM.GetContextCollection("ACDB_ANNOTATIONSCALES")
                    ObjectContexts.AddContext(blockref, OCC.CurrentContext)

                End If
                Tr.AddNewlyCreatedDBObject(blockref, True)
                Tr.Commit()
                Tr.Dispose()
                If DB IsNot Nothing Then DB.CloseInput(True) : DB.Dispose()
                If xDb IsNot Nothing Then xDb.CloseInput(True) : xDb.Dispose()
            End Using
        End Using
    End Sub

Public Sub main()   
   
    Call Init_Block(Pfad, Point)

    'Hier frage ich Abmaße der Blockref ab

    blockref.Erase()

End Sub
------------------------------------------------------------------------------------------------------------

Bei der markierten Zeile kommt die Meldung:

INTERNER FEHLER: !dbobji.cpp@7227: eNotOpenForWrite

AutoCAD schließt sich anschließend und fragt ob es versuchen soll die Zeichnung zu speichern.
Mit der Meldung kann ich nichts anfangen!?

Danke für eure Hilfe

Silvan

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


Ex-Mitglied

erstellt am: 05. Aug. 2009 16:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

wenn Du einen BreakPoint setzt bei  'blockref.erase'  dann wirst Du sehen, dass die Eigenschaft 'isWriteEnabled' auf false steht (weil eben keine TransAction aktiv, die BlockReferenz nicht mit dieser TransAction zum Schreiben geöffnet ist).

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 05. Aug. 2009 16:45    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

Hallo Alfred,

hast mal wie immer Recht gehabt  Dankeschön!

Grüße

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

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 13. Aug. 2009 09:48    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

Hallo,

ich will nachdem ich den Block gelöscht habe ihn im späteren Programmablauf wieder (häufig) platzieren. Bei meinem Programm geht es darum ein Umkreis mit gewählten Blöcken zu füllen. Hab jetzt diese Funktion probiert:
    Public DB As Database
    Public Tr As Transaction
    Public CurrSpace As BlockTableRecord
    Public Blockref As BlockReference
    Public Doc As Document

    Doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
    DB = Doc.Database
    Tr = Doc.TransactionManager.StartTransaction()

    'Hier kommt der oben stehende Init-Fall
    'Und im weiteren Verlauf wird die folgende Funktion häufiger aufgerufen.

    Sub Set_Block(ByVal Coordinate As Point3d, ByVal BlockID As ObjectID)
        CurrSpace = TryCast(Tr.GetObject(DB.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
        Blockref = New BlockReference(Coordinate, BlockID)
        CurrSpace.AppendEntity(Blockref)
        Blockref.SetDatabaseDefaults()
        Tr.AddNewlyCreatedDBObject(Blockref , True)
        Blockref.ExplodeToOwnerSpace()
    End Sub

    'Am Ende des Programms schließe ich noch DB und TR

Leider kommt bei der markierten Zeile ein Error (SYSTEMFEHLER: Unhandled XXXXXXXX Exception XXXXXXXX). Der Block erscheint auch nicht auf der AutoCAD Zeichnungsfläche. Wie bekomme ich meine Funktion ans laufen?
Am Ende des Programms schließe ich noch DB und TR.

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 13. Aug. 2009 10:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Silvan,

ich arbeite nicht mit  '.ExplodeToOwnerSpace'  (aber hat keinen besonderen Grund), ich könnte mir aber vorstellen, dass ev. die Transaction zuvor Commitet sein muss, bevor Du das Explode startest (damit die BlockReference wirklich in der Datenbank ist).

Du kannst auch mal probieren, mit '.Explode' zu arbeiten, dann brauchst Du die BlockReference erst gar nicht in den aktuellen Space hineinzuklopfen, um sie nachher zu löschen. '.Explode' liefert Dir die Teilelemente als DBObjectCollection (wenn ich's richtig im Kopf habe) und diese Elemente kannst Du dann Stück für Stück dem Space hinzufügen (und dabei auch noch auswählen, ob's überhaupt dazukommen soll).

Siehe zu '.Explode' auch dieses hier (hier nach 'Explode' suchen und Du kommst direkt zu einem Sample).

- alfred -

------------------
www.hollaus.at

[Diese Nachricht wurde von a.n. am 13. Aug. 2009 editiert.]

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 13. Aug. 2009 10:40    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

Hallo Alfred,

hab das .Commit() eingebaut hat aber nichts gebracht der Error erscheint weiterhin.
Kann es sein, dass es zu Problemen kommt wenn ich im Init-Fall die blockref erase und die Referenz später neu platzieren will (Wobei ich den ID der Blockref vor dem .erase in einer anderen Variable ablege die ich dann zur Set_Block Funktion übergebe)?

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 13. Aug. 2009 10:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Silvan,

nur um nicht vielleicht falsch gelöscht zu haben (ist nur Gefühl aus der Magengegend):

Du löscht zuvor aber schon die BlockReference und nicht die Blockdefintion? Prüf sicherheitshalber mal die Variable 'BlockID' auf die Eigenschaften '.isValid' und '.isErased'.

Hast Du's auch schon mal mit einem anderem Block probiert, ev. hast Du ein Problem mit dem Block selbst oder ev. mit ungleichmäßiger Skalierung (X:Y:Z nicht proportional), vielleicht kann das der '.ExplodeToOwnerspace' nicht?

Du kannst ja mal probehalber auf das normale '.Explode' umdrehen, damit Du erkannst, ob zerlegen vielleicht grundsätzlich nicht geht.

Und dass der Block bei der Definition die Eigenschaft 'Ursprung zulassen' richtig gestellt ist, davon dürfen wir ausgehen?

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 13. Aug. 2009 11:29    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

Hallo Alfred,

bei dem blockID hier ist IsErased und IsValid auf true.
blockref = New BlockReference(Coordinate, blockID)
beim blockID in der blockref anschließend steht isValid auf true und isErased auf false.

Das Löschen nach dem Init-Fall findet folgendermaßen statt (Vorher allerdings hol ich mir den ID der blockref):
blockID = blockref.ObjectId
blockref.erase()

Muss ich die blockref anders löschen?

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 13. Aug. 2009 11:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi, 
Zitat:
bei dem blockID hier ist IsErased ... auf true.
==> das ist ein Fehler, Du kannst eine Blockdefinition, die gelöscht ist, nicht mehr zum Einfügen verwenden!!

Der zweite (oder eher vorrangige Fehler) ist, dass Du bei:

blockID = blockref.ObjectId
...
New BlockReference(Coordinate, BlockID)

mit 'BlockID' die ObjectID der Blockdefinition angeben musst, ein Wunder, dass das überhaupt anders geht, das könnte aber auch ungeahnte Möglichkeiten für böse Tricksereien eröffnen: Das behalt ich gleich mal in meinen Gedanken! 

Dein Code gehört wohl auf folgendes umgebaut:

Code:
blockID = blockref.BlockTableRecord
...
New BlockReference(Coordinate, BlockID)

HTH, - alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 14. Aug. 2009 13:02    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

Hallo Alfred,

na erstmal gut, dass ich durch Fragen neue Ideen zu Trickserein einbringen konnte 
Hab noch eine weitere Frage und zwar kann sich das Handle einer Blockref ändern?
In meinem Programm platziere ich mit der oben genannten Funktion immer wieder Blockreferenzen.
Zu einem späteren Zeitpunkt frage ich mit einem Selectionset ab, ob die Blockref innerhalb eines Polygons ist:

Dim S_Set_Obj As AcadSelectionSet
S_Set_Obj = App.ActiveDocument.SelectionSets.Add("TempSSET")
If S_Set_Obj Is Nothing Then S_Set_Obj = App.ActiveDocument.SelectionSets.Item("TempSSET")
S_Set_Obj.Clear()
Call S_Set_Obj.SelectByPolygon(AcSelect.acSelectionSetWindowPolygon, Coordinates)

If S_Set_Obj.Count > 0 Then
For I = 0 To S_Set_Obj.Count - 1
Dim tLastEnt As Autodesk.AutoCAD.DatabaseServices.DBObject = Tr.GetObject(DBObject.FromAcadObject(S_Set_Obj.Item(I)), OpenMode.ForRead, True, True)
If CType(tLastEnt, BlockReference).Handle.ToString = blockref.Handle.ToString Then
Outside_check = False 'IO
End If
Next
End If

Ich bin mir nicht 100% sicher aber ich bilde mir ein das tlastent.Handle.Value ist immer 6 höher als blockref.handle.value, obwohl es die gleiche blockref sein sollte??? (Blockref ist sicher innerhalb des Polygons...)

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 14. Aug. 2009 13:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi, 
Zitat:
Ich bin mir nicht 100% sicher aber ich bilde mir ein das tlastent.Handle.Value ist immer 6 höher als blockref.handle.value, obwohl es die gleiche blockref sein sollte???
...kann es sein, dass Deine BlockReference AttributReferences beinhaltet?

Denn der ModelSpace gibt Dir die AttributeReferences nicht mit zurück (da diese ja eigentlich Bestandteil/untergeordnet zu der BlockReference sind), aber für die Verwaltung von Elementen wird Handle trotzdem weitergezählt.

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 14. Aug. 2009 14:02    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

Hallo Alfred,

ich weiß nicht wirklich wie ich das überprüfen kann ob meine blockref AttributReferenzes beinhaltet. (Property AttributCollection = 0 wenn du das meinst  )

Sollte ich eventuell nach einem anderen Property überprüfen?

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 14. Aug. 2009 14:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Silvan,

3 Möglichkeiten

- die BlockRef.AttributeCollection.Count - Eigenschaft prüfen
- den Block im AutoCAD doppelklicken ==> geht der Attributdialog auf, dann hat dieser Attribute
- Du holst Dir den Handle Deines <tLastEnt>, erhöst diesen Wert um 1, schaust, ob für diesen Handle ein Entity existiert, holst Dir dieses, dann weisst Du auch, was zwischen Deinem Block und dem letzten Element des aktiven Bereichs existiert.

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 14. Aug. 2009 14:19    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

Hallo Alfred,

wie gesagt Blockref.AttributCollection.Count = 0.

Ich zeig mal die .Handle.Value Werte der Platzierungen, um es zu veranschaulichen.

Beim ersten Platzieren:
Blockref.Handle.Value = 3371
tLastEnt.Handle.Value = 3377

Beim zweiten Platzieren:
Blockref.Handle.Value = 3378
tLastEnt.Handle.Value = 3384

Grüße

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


Ex-Mitglied

erstellt am: 14. Aug. 2009 14:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

OK, hab ich zuerst anders verstanden. 

Wenn es noch immer um den Code mit Explode geht, dann werden ja dazwischen Elemente angelegt, kann es sein, dass deswegen der scheinbare Sprung um 7 existiert? Dann werden das wohl die Elemente sein, die durch das Explode zustandekommen.

BTW: Handle darf nicht als fortlaufender ID-Wert angesehen werden. In der Regel, erstellst Du eine Linie und dann eine zweite, bekommen diese schon Handles, die fortlaufend erscheinen. Aber es können im Zuge von ProgrammCode temporäre Elemente angelegt und dann gelöscht werden, die je nach Umgang mit TransAction oder je nach Programmfunktion auch schon Handles brauchen. UND... gelöschte Elemente behalten den Handle und geben diesen nicht mehr frei (in der aktuellen Session).

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 14. Aug. 2009 14:39    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

Hey Alfred,

ich komm langsam dahinter :P.
Fällt dir eine anderes bzw. besseres Property ein, dass evtl. nicht den wert ändert, wenn andere Objekte hinzugefügt werden?

Grüße

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


Ex-Mitglied

erstellt am: 14. Aug. 2009 14:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Silvan,

ich hab den Überblick verloren 
Es scheint sich dieser Thread durch unterschiedlichste Themen zu ziehen, aber ich bekomm auf die schnelle nicht raus, was Du eigentlich vorhast. Ich kann mich zwar erinneren, dass Du irgendwas mit Kacheln innerhalb einer Polylinie machst; aber da waren wohl zu viele Beiträge dazwischen, dass ich Deine Aufgabenstellung noch in Erinnerung habe (Alzheimer macht sich breit  ).

Und deswegen ist mir die Angabe  Fällt dir eine anderes bzw. besseres Property ein, dass evtl. nicht den wert ändert, wenn andere Objekte hinzugefügt werden?  nicht wirklich verständlich.

Kannst bitte nochmals kurz erklären (auf dieses Einfügen, Explodieren, Löschen, neu Suchen) was eigentlich gemacht wird?

Sorry für meine Lücken, - alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 14. Aug. 2009 15:19    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

Hallo Alfred,

ja kein Problem ich erklärs gern nochmal.

Also folgendermaßen sieht mein Programm aus. Der Benutzer wählt eine .Dwg Datei in der ein Block ist.
Danach wählt er eine Umrandung(Polylinie) die mit dem zuvor gewählte Block gefüllt werden soll (Ähnlich wie Fliesen verlegen bloß ohne halbe Fliesen). Zuerst füge ich den Block einmal ein und lösch ihn anschlißend wieder(Um dessen Abmaße zu erhalten). Danach wird der Block immer wieder nebeneinander eingefügt. Nach jedem einfügen wird überprüft, ob der letzte gesetzte Block innerhalb der Polylinie ist. Wenn ja dann wird ein neuer platziert, wenn nicht wird der zuvor platzierte Block gelöscht und es beginnt eine neue Reihe von Blöcken.

Bei der Überprüfung, ob der Block innerhalb oder außerhalb liegt arbeite ich mit einem Selectionset und der Methode acSelectionSetWindowPolygon. In meinem SelectionSet habe ich dann also alle Blöcke, die bis jetzt eingefügt wurden. Jetzt suche ich eine Möglichkeit um jedes Object im SelectionSet mit dem zuletzt eingefügten Block zu vergleichen (wobei sich der Handle Wert ändert).

Hoffe das war ausführlich genug.

Grüße

Silvan

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


Ex-Mitglied

erstellt am: 14. Aug. 2009 15:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

Du kannst keine Blöcke über Handle vergleichen, denn einen Handle kann's nur einmal geben, zwei BlockReferenzen können nie den gleichen Handle haben.

Schnellere Methode zu Deinem Vorhaben, so die Polylinie nur gerade Segmente und keine Bögen hat:

- User wählt Block aus
- User wählt Polylinie aus
- Du ermittelst von der Polylinie die Extents
- Du erstellst ein Array von Blockreferenzen über die gesamten Extents, speicherst dabei die ObjectIDs der erstellten Blockreferences in eine ObjectIDCollection
- Danach machst Du ein SelectionSet über WindowPolygon (die Koordinaten werden von der Polylinie ausgelesen, aus Toleranzgründen ev. vorher die gewählte Polylinie um einen Toleranzwert nach aussen versetzen und diese Koordinaten verwenden)
- Jetzt gehst Du die ObjectIDCollection vom Array durch, vergleichst, ob diese im SelectionSet vorkommen, wenn nein, dann löschen.

Ist das der Weg den Du gehst? Deiner Beschreibung nach nein, ich glaube nur dass trotz Erstellen und Löschen meine Variante a) einfacher ist und b) schneller.

- alfred -

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 14. Aug. 2009 15:46    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

Hallo Alfred,

ich hab vergessen zu sagen, dass der User den ersten Block am Mauszeiger hängen hat und die Umrandung dann nach dem ersten manuell platzierten Block gefüllt wird.

Deine ersten 3 Punkte mach ich. Und dann wählt der User den Startpunkt für die Blöcke manuell. Deswegen platziere ich jeden Block und muss es gegebenenfalls wenns auserhalb ist löschen. Ich weiß das ist ziemlich umständlich aber ich hab keine andere Lösung gefunden...

Grüße

Silvan

[Diese Nachricht wurde von Silvan01 am 14. Aug. 2009 editiert.]

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


Ex-Mitglied

erstellt am: 14. Aug. 2009 15:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

das mit dem benutzerdefinierten Startpunkt kannst Du genauso mit meiner Vorgehensweise machen, ändert nur die Basis des Array's.

- alfred -

siehe PM

------------------
www.hollaus.at

Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 10. Jun. 2010 12:04    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

Hallo nochmal,

wollte mal fragen wie ich checken kann ob

Code:
TrAct.AddNewlyCreatedDBObject(Bref, True)

diese Bref nicht schon vorhanden ist um einen Error (Already in DB) abzufangen.

Grüße und Dank im Vorraus

Silvan

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


Ex-Mitglied

erstellt am: 10. Jun. 2010 12:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

Du kannst prüfen:

a) die Eigenschaft BlRef.ObjectID.isValid eines Elements
b) sollte es auch sowas geben wie BlRef.isPersistent oder BlRef.IsTransactionResident

- alfred -

------------------
www.hollaus.at

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