| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blockattribute eingeben; Layer löschen (3189 mal gelesen)
|
MartinM Mitglied
Beiträge: 122 Registriert: 27.11.2001 ACAD Map2015 3D, W7 x64 Prof. SP3
|
erstellt am: 17. Okt. 2003 13:34 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich setze mittels VBA-Programm zunächst einen Layer und anschließend wird ein Block incl. Attribute eingefügt. Funktioniert alles bestens ABER: Wenn ich anschließend den Block auf einen anderen Layer lege, kann ich den Ursprungslayer (wo der Block originär eingfügt wurde) nicht mehr löschen. Erst wenn ich die Blockdefinition ändere (ohne Attribute) kann ich auch den Ursprungslayer löschen. Natürlich könnte ich hergehen, und den Layer mit entsprechenden Hilfmitteln (Expresstools) entfernen, ich glaube aber, dass am Programmcode etwas verbesserungswürdig wäre - nur was ? Viele Grüsse Martin CODE: ThisDrawing.ActiveLayer = ThisDrawing.Layers(strLayer)
adblInsertPoint(0) = dblRechts adblInsertPoint(1) = dblHoch adblInsertPoint(2) = 0 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(adblInsertPoint, "RefPkt", 1#, 0.5, 1#, 0) ' Blockattribute setzen For Each varAttribut In blockRefObj.GetAttributes Select Case varAttribut.TagString Case "PNR": varAttribut.TextString = lngPktNr Case "HOE": varAttribut.TextString = strHoehe End Select Next varAttribut
[Diese Nachricht wurde von MartinM am 17. Oktober 2003 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
harryk Mitglied Projektleiter
Beiträge: 124 Registriert: 19.08.2003
|
erstellt am: 17. Okt. 2003 19:07 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
wenn Du den z.Zt. aktiven Layer löschen möchtest musst Du vorher einen anderen aktiv setzen, z.B. Layer 0. Aktive Layer sind referenziert auch wenn keine Elemente darauf gezeichnet sind. An Deinem Code dürfte es nicht liegen. Gruss, Harry Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Acad 2011-deutsch, Express Tools 3ds Max 2010 Win 7-Professional HP Workstation Z400, 6GB GeForce GTX 470
|
erstellt am: 17. Okt. 2003 20:29 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
MartinM Mitglied
Beiträge: 122 Registriert: 27.11.2001
|
erstellt am: 20. Okt. 2003 08:21 <-- editieren / zitieren --> Unities abgeben:
Hallo, @Roland: Volltreffer, es funktioniert ! Danke. Hintergründe für die, die es interessiert: Wenn ein Block mit Attributen in eine aktuelle Zeichnung eingefügt wird, landen selbstverständlicher weise alle Elemente des Blocks, die auf Layer 0 gezeichnet sind, im aktuellen Layer - auch die Attribute ! Wenn ich anschließend den Block auf einen anderen Layer schiebe, bleiben die (unsichtbaren)Attribute auf dem "alten" Layer, der dann natürlich nicht gelöscht werden kann ! Viele Grüsse Martin
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Acad 2011-deutsch, Express Tools 3ds Max 2010 Win 7-Professional HP Workstation Z400, 6GB GeForce GTX 470
|
erstellt am: 20. Okt. 2003 08:37 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
Hab da ein kleines Tool geschrieben, setzt alle Attribute auf ByBlock und Layer 0. Code: Public Sub BlockAttColToByBlock() ' Ändert alle Attribute der gezeigten Blöcke auf Farbe "ByBlock" und Layer "0" Dim SS As AcadSelectionSet Dim FltTypes(0) As Integer Dim FltData(0) As Variant Dim BlObj As AcadBlockReference Dim BlAttrib As Variant Dim objAtt As AcadAttributeReference Dim Count As Integer On Error GoTo Err_Control ' Frage nach den zu bearbeitenden Blöcken FltTypes(0) = 0: FltData(0) = "INSERT" Set SS = SelectOnScreenFix(FltTypes, FltData, "BlockAttColToByBlockAuswahl") 'SS.SelectOnScreen FltTypes, FltData If SS.Count = 0 Then GoTo ENDE For Each BlObj In SS If BlObj.HasAttributes Then BlAttrib = BlObj.GetAttributes For Count = UBound(BlAttrib) To 0 Step -1 Set objAtt = BlAttrib(Count) objAtt.Color = acByBlock objAtt.layer = "0" objAtt.Lineweight = acLnWtByBlock Next Count End If Next BlObj Set BlObj = Nothing Set objAtt = Nothing ENDE: SS.Delete Set SS = Nothing Exit_Here: Exit Sub Err_Control: Err.Clear Resume Exit_Here End Sub
End Sub
------------------ Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 27. Jun. 2007 13:24 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 27. Jun. 2007 13:44 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
Hallo, ändere doch mal die Zeilen ein wenig ab.
Code:
'Set SS = SelectOnScreenFix(FltTypes, FltData, "BlockAttColToByBlockAuswahl") SS.SelectOnScreen FltTypes, FltData
SelectOnScreenFix scheint eine Funktion von Roland zu sein die er aber nicht gepostet hat. SelectOnScreen ist eine aus AutoCAD-VBAAusserdem kannst du die Sub ja mal mit F8 im Einzelschritt durchgehen. Dann wirst du sehen wo es hängt. Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 28. Jun. 2007 07:49 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 28. Jun. 2007 07:52 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
wenn ich das letzte end sub wegnehme würde es gehen aber wenn ich im autocad vbaausf eingebe und die dvb ausführe kommt genau nichts. leider kenn ich mich relativ wenig aus. ich würde um hilfe bitten dankeschön MFG eilovliz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 28. Jun. 2007 14:17 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 02. Jul. 2007 08:00 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 02. Jul. 2007 20:50 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
Hallo, Zitat: wenn ich das letzte end sub wegnehme würde es gehen
Wo hast du das gefunden ? Zitat: ich hab den oberen verwendet ??
Es stellt sich auch die Frage wo oben ? Ich nehme mal an es war dieser hier.
Code: Public Sub BlockAttColToByBlock() ' Ändert alle Attribute der gezeigten Blöcke auf Farbe "ByBlock" und Layer "0" Dim ss As AcadSelectionSet Dim FltTypes(0) As Integer Dim FltData(0) As Variant Dim BlObj As AcadBlockReference Dim BlAttrib As Variant Dim objAtt As AcadAttributeReference Dim Count As Integer On Error Resume Next Set ss = ThisDrawing.SelectionSets("Att") If Err.Number Then Set ss = ThisDrawing.SelectionSets.Add("Att") End If On Error GoTo Err_Control ' Frage nach den zu bearbeitenden Blöcken FltTypes(0) = 0: FltData(0) = "INSERT" ss.SelectOnScreen FltTypes, FltData If ss.Count = 0 Then GoTo ENDE For Each BlObj In ss If BlObj.HasAttributes Then BlAttrib = BlObj.GetAttributes For Count = UBound(BlAttrib) To 0 Step -1 Set objAtt = BlAttrib(Count) objAtt.color = acByBlock objAtt.Layer = "0" objAtt.Lineweight = acLnWtByBlock objAtt.Update Next Count End If Next BlObj Set BlObj = Nothing Set objAtt = Nothing ENDE: ss.Delete Set ss = Nothing Exit_Here: Exit Sub Err_Control: Err.Clear Resume Exit_Here End Sub
Viel ErfolgWilfried Stelberg PS: klemmt eigentlich deine Shift taste ??? ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 03. Jul. 2007 08:11 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
das funktioniert super! aber warum setzt er mit die linien in einem block nicht auf von layer?kann man das auch machen? vielen dank für die rasche meldung. warum soll meine shift taste hängen? MFG eilovliz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
Beiträge: 1357 Registriert: 24.07.2002 AutoCAD ACA 2018 Solidworks 2016 Sp5 Enterprise PDM 2016 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell T3620 Intel Core i7-7700K 16 GB Arbeitsspeicher 2x Samsung S24C650 Dell M4800
|
erstellt am: 03. Jul. 2007 08:22 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
Hi eilovliz, Was soll den bei den Linien auf vonLayer gestzt werden?! Du kannst ja den Lininietyp, die Linienstärke, die Farbe usw. auf vonLayer setzen. Da Wilfried oben die Linienstärke und die Farbe schon auf vonBlock gesetzt hat, willst du denke ich den Linientyp ändern. Das kannst in der Art: "object.Linetype = acLnWtByBlock" oder auf vonLayer machen. Zur Schift-Taste: Man sollte doch mal mit Groß-/ Kleinschreibung arbeiten, da das lesen des Textes doch etwas einfacher wird. Und soviel (Mehr-)Aufwand dürfte das doch auch nicht sein, oder?! Gruß, Carsten [Diese Nachricht wurde von Carsten1210 am 03. Jul. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 03. Jul. 2007 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
Hy danke für deine Antwort. Wenn ich einen Block habe der mit Linien und einem Attribut erstellt wurde. Und alles liegt auf Farbe Rot. Dann wäre es Super wenn ich Praktisch in alle Blöcke eingreifen könnte und alles auf vonlayer setzte. Weißt du was ich meine? Vielen Dank MFG eilovliz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
Beiträge: 1357 Registriert: 24.07.2002 AutoCAD ACA 2018 Solidworks 2016 Sp5 Enterprise PDM 2016 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell T3620 Intel Core i7-7700K 16 GB Arbeitsspeicher 2x Samsung S24C650 Dell M4800
|
erstellt am: 03. Jul. 2007 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 03. Jul. 2007 10:34 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 03. Jul. 2007 11:23 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
Hallo, so nun der letzte Versuch. Mit dieser Funktion kannst du die Blockdefinitionen ändern. Sie ändert auch eventuelle Subblocks in der Definiton ab. Bei den eingefügten Blöcken werden so auch alle Entitys (ausser den Attributten) geändert, da der Insert ja nur eine Referenz auf die Blockdefinition ist. Bei den Attributten wird beim Einfügen nur die Vorlage aus der Definition verwendet. Sollen hier die Eigenschaften (Layer, Farbe, ..) geändert werden musst du das bei der jeweiligen Einfügung machen. Dafür ist die Funktion aus dem ersten Post.
Code: Public Sub BlockToByBlock() Dim ObjBlockRef As AcadBlockReference Dim objBlockDef As AcadBlock Dim dblPkt(0 To 2) As Double On Error GoTo Err_Control ThisDrawing.Utility.GetEntity ObjBlockRef, dblPkt, Chr(10) & "Blockvorlage wählen: " On Error GoTo 0 Set objBlockDef = ThisDrawing.Blocks(ObjBlockRef.Name) ' SetBlockToDefault objBlockDef, "0", acByLayer '(256) SetBlockToDefault objBlockDef, "0", acByBlock '(0) ThisDrawing.Regen acActiveViewport Exit_Here: Exit Sub Err_Control: Err.Clear Resume Exit_Here End SubPublic Sub SetBlockToDefault(objBlockDef As AcadBlock, strLayer As String, lngColor As Long) Dim objEntity As AcadEntity ' Jedes Element in der Auflistung zurücksetzen For Each objEntity In objBlockDef Debug.Print objEntity.ObjectName If objEntity.ObjectName = "AcDbBlockReference" Then ' Subblocks rekursiv ändern SetBlockToDefault ThisDrawing.Blocks(objEntity.Name), strLayer, lngColor End If objEntity.color = lngColor objEntity.Layer = strLayer Next objEntity End Sub
Wilfried Stelberg------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 03. Jul. 2007 11:48 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 03. Jul. 2007 12:44 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
Hallo, dann kopier noch diese Funktion dazu. Sie ändert in der ganzen Zeichnung die Blöcke, egal ob sie verwendet werden oder nicht.
Code: Public Sub AllBlocksToByBlock() Dim objBlockDef As AcadBlock For Each objBlockDef In ThisDrawing.Blocks If Not objBlockDef.IsLayout And Not objBlockDef.IsXRef Then SetBlockToDefault objBlockDef, "0", acByBlock End If Next objBlockDef ThisDrawing.Regen acAllViewports End Sub
Ansonsten hast du in den Funktionen alle Mittel drin aus der Einzelauswahl eine Selektion zu machen. Aber mit der obigen Funktion kann man ganz gut leben.Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 03. Jul. 2007 13:00 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 03. Jul. 2007 13:10 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 03. Jul. 2007 13:16 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|
eilovliz Mitglied Technischer Zeichner
Beiträge: 48 Registriert: 24.06.2004
|
erstellt am: 04. Jul. 2007 08:09 <-- editieren / zitieren --> Unities abgeben: Nur für MartinM
|