Skocz do zawartości

Curve - separate by loose parts


Rekomendowane odpowiedzi

Napisano

Witam. Znacie może jakiś skrypt pozwalający rozłączyć automatycznie wszystkie krzywe metodą "By loose parts"?

Mam do zaimportowania złożone wektorowe obiekty jako *.svg, którym muszę zwiększyć wartość parametru "Extrude".

Niestety w przypadku krzywych polecenie "Copy to selscted" jest nieaktywne więc trzeba powtarzać czynność na każdej krzywej oddzielnie albo wszystkie je połączyć, dostosować "Extrude" a następnie rozłączać jedna po drugiej, lecz to bardzo czasochłonne przy większej ilości krzywych.

 

Z góry dzięki

THBWT7L.png

  • Odpowiedzi 16
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Napisano (edytowane)

Trochę od drugiej strony niż pytasz, ale jak chcesz masowo zmienić wartość "extrude" dla krzywych to spróbuj takiego skryptu:

import bpy

obs = bpy.context.selected_objects

for ob in obs:
   if ob.type == 'CURVE':
       curve = ob.data
       curve.extrude = 1         

 

Swoją drogą wyciąganie z svg to potężne narzędzie w wielu zastosowaniach. W kodzie zamiast "1" wpisujesz żądaną wartość.

Edytowane przez alex3d
Napisano

Jakbyś dalej potrzebował to tutaj lamerski skrypt rozdzielający krzywe.

 

import bpy

obj = bpy.context.active_object
splines = obj.data.splines

# Count splines loop
spl_cnt = -1
for x in splines:
   spl_cnt = spl_cnt + 1

# Split last spline loop
for x in splines:
   if spl_cnt == 0:
       pass
   else:
       bpy.ops.object.mode_set(mode='EDIT')
       bpy.ops.curve.select_all(action='DESELECT')
       splines[spl_cnt].bezier_points[0].select_control_point = True
       bpy.ops.curve.select_linked()
       bpy.ops.curve.separate()
       spl_cnt = spl_cnt - 1

Napisano

O i super dzięki chłopaki :)

Monio mógłbyś dopisać do swojego skryptu operator itd i wydać jako addon, bo na blender artists tez pytali to takie coś a z tego co pamiętam to nie padło jednoznaczne rozwiązanie.

alex3d twoja opcja też się przyda - jeśli uda mi się zagnieździć gdzieś ten kawałeczek kodu z możliwością zmiany wartości.

Napisano

Nanoman- Blender robi coś strasznego podczas przenumerowywania splineów gdy jakiś usuniesz czy odseparujesz. W moim skrypcie usuwam te ostatnie bo gdy wycinałem ten pierwszy (id 0) robił jakieś bzdury na przykład działał na co drugim spline, jakby update nie robił się z kazdym operatorem tylko co drugie wywołanie w petli. Trzeba było odpalić skrypt kilka razy do skutku żeby wykonał swoją robotę. Jednak przy usuwaniu ostatniego tez nie jest tak pięknie, zdarzyło mi się że pominął jakiegoś splinea. Wiem jak zrobić żeby ten skrypt działał zawsze poprawnie i tylko na obiektach typu curve i miał fikuśne UI ale napisanie go zajęłoby mi kilka razy więcej czasu którym teraz nie dysponuje. Może kiedyś, nie w przed październikiem. ;)

Napisano
Nanoman- Blender robi coś strasznego podczas przenumerowywania splineów gdy jakiś usuniesz czy odseparujesz. W moim skrypcie usuwam te ostatnie bo gdy wycinałem ten pierwszy (id 0) robił jakieś bzdury na przykład działał na co drugim spline, jakby update nie robił się z kazdym operatorem tylko co drugie wywołanie w petli...

 

Wciąż za mało znam pythona ale może w momencie odseparowywania pierwszego splajnu, ten następny w kolejce staje się pierwszy w grupie i przyjmuje w tym momencie id 0?

Napisano

Monio: Nanoman chyba ma racje powinieneś chyba użyć while, chyba że nie rozumiem problemu możesz sprawdzić na tym

import bpy

obj = bpy.context.active_object
splines = obj.data.splines
lastmode = bpy.context.mode
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.curve.select_all(action='DESELECT')

while (len(splines)>1):
   splines[0].bezier_points[0].select_control_point = True
   bpy.ops.curve.select_linked()
   bpy.ops.curve.separate()

try:
   bpy.ops.object.mode_set(mode=lastmode)
except: 
   pass

Napisano

takie ?

import bpy

obj = bpy.context.active_object
splines = obj.data.splines
lastmode = bpy.context.mode
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.curve.select_all(action='DESELECT')

while (len(splines)>1):
   spline = splines[0]    
   if (spline.bezier_points):
       spline.bezier_points[0].select_control_point = True
   if (spline.points):     
       spline.points[0].select = True
   bpy.ops.curve.select_linked()
   bpy.ops.curve.separate()
try:
   bpy.ops.object.mode_set(mode=lastmode)
except: 
   pass

Napisano

Tak proszę Pana takie :):) Teraz działa na wszystkich rodzajach krzywych. No to szczuro ponawiam propozycję do opublikowania jako pełnoprawnego dodatku, bo na pewno wielu ludziskom się przyda...

 

Podziękował...

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ę



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności