ZWCAD - Bloki dynamiczne i atrybuty


Rekomendowane odpowiedzi

1. Nie ma gotowego automatu, trzeba poskładać.

  1. możemy sprawdzić co jest zaznaczone
  2. trzeba z tego odfiltrować bloki
  3. z nich można odczytać nazwy.
Dim sset As ZcadSelectionSet
Dim ssobject As ZcadEntity
Dim nazwa As String
Set sset = ThisDrawing.PickfirstSelectionSet
For Each ssobject In sset
	nazwa = ssobject.ObjectName
    If ssobject.ObjectName = "AcDbBlockReference" Then
    	Dim blok As ZcadBlockReference
        Set block = ssobject
        Dim punkt As Variant

		punkt = block.InsertionPoint

	End If
Next ssobject

2. Jest możliwość wybierania we wskazanym punkcie z filtrami określającymi co ma być wybrane np tylko bloki:

Dim FilterType(0) As Integer
Dim FilterData(0) As Variant
    
FilterType(0) = 0
FilterData(0) = "Insert"

Dim ssetObj As ZcadSelectionSet
Set ssetObj = ThisDrawing.SelectionSets.Add("1")
Dim point(0 To 2) As Double
point(0) = 820.4691: point(1) = 954.628: point(2) = 0

ssetObj.SelectAtPoint point, FilterType, FilterData

Z tego zbioru trzeba odczytać nazwy.

O zaznaczaniu było tutaj

3. Ta konstrukcja jest dla mnie zbyt skomplikowana. W moim pojęciu zaintegrowanie w blok to właśnie jego edycja. Gdzie jest różnica? co ma się dziać? a co nie? dlaczego edycja nie jest odpowiednią operacją?  Np zmiana koloru elementów w bloku to właśnie jego edycja. Możemy wszystkim elementom w definicji ustawić kolor na "JakBlok" i wstawionemu blokowi zmienić kolor. To wystarczy?

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

W dniu 13.01.2022 o 07:48, pop3k napisał:

Może da się zatem zmienić tylko kolor jego atrybutów?

Witam

tutaj przykład programu na zmianę koloru atrybutu bloku :

On Error Resume Next

ThisDrawing.SelectionSets.Item("grupa1").Delete
Dim sset1 As ZcadSelectionSet
Dim ent As ZcadEntity
Dim blk As ZcadBlockReference
Set sset1 = ThisDrawing.SelectionSets.Add("grupa1")
Dim att1 As Variant

ThisDrawing.Utility.Prompt ("wskaż obiekt(y) bloki z atrybutami")
sset1.SelectOnScreen

For Each ent In sset1

If ent.ObjectName = "AcDbBlockReference" And ent.HasAttributes = True Then
Set blk = ent

att1 = blk.GetAttributes

att1(0).color = "3"     'tutaj trzeba wpisać nr. atrybutu gdzie 0 to pierwszy itd... a 3 to nr. koloru
End If

Next

PS.

Może by lepiej było stworzyć jakąś tabelkę ?, który by wyciągał potrzebne informację z bloku dynamicznego.

np. mamy 50 takich bloków "zbrojenia" czyli 50 wierszy z kolumnami "długość pręta", "rozpiętość", "współrzędna x", "współrzędna y"

dodatkowo w kolumnie by był numer unikatowy bloku "thisdrawing.ModelSpace.Item(numer)" czy uchwyt bloku wtedy można by taką tabelkę aktualizować. (pobierał by numer z tabelki do vba). + najlepiej z datą ostatniej modyfikacji (jeżeli w ogóle zwcad posiada takie dane)

ale nie wiem czy takie makro w ogóle można stworzyć ? więc to takie moje teoretyczne rozważania :)

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie