Rekomendowane odpowiedzi

Opublikowano

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?

 

 

Opublikowano

Co do 3. Może nie edytujmy bloku, bo zaraz wszystkie bloki o tej nazwie będą miały zmieniony kolor a mi zależy tylko na jednym.

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

Opublikowano
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 :)

Opublikowano

Dziękuję bardzo za pomoc, spróbuję poskładać wszystko do kupy i stworzyć mój superblok. 

Co do zliczania pozycji to już mam takie makro (ewentualnie korzystam z już dostępnych)

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się