kruszynski Opublikowano 13 Stycznia 2022 Zgłoś Opublikowano 13 Stycznia 2022 1. Nie ma gotowego automatu, trzeba poskładać. możemy sprawdzić co jest zaznaczone trzeba z tego odfiltrować bloki 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? Cytuj
pop3k Opublikowano 13 Stycznia 2022 Autor Zgłoś Opublikowano 13 Stycznia 2022 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? Cytuj
Adam_x Opublikowano 14 Stycznia 2022 Zgłoś Opublikowano 14 Stycznia 2022 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 Cytuj
pop3k Opublikowano 14 Stycznia 2022 Autor Zgłoś Opublikowano 14 Stycznia 2022 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) Cytuj
Rekomendowane odpowiedzi
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ą.