Wymiarowanie podłączonych elementów w Dynamo

W jednym z poprzednich postów pokazywałem jak przy pomocy Dynamo możemy wymiarować ściany kurtynowe. Problem poruszony w wątku na forum dotyczącym Dynamo uzmysłowił mi, że metoda ta nie zadziała w przypadku ścian osadzonych w zewnętrzny, podłączanym, pliku.

W celu stworzenia linii wymiarowej w Revicie przy pomocy skryptu należy stworzyć wpierw listę tzw. referencji – czyli odniesień do obiektów, które mają zostać zwymiarowane. Według dokumentacji Revit API dla podłączanych elementów należy tworzyć tzw. „LinkedReference”, w następujący sposób:

linkedReference = obj.Reference.CreateLinkReference(linkedInstance)

Gdzie „obj” to obiekt dla którego tworzymy referencję, a „linkedInstance” to zmienna odnosząca się do podłączanego dokumentu. Niestety tak utworzone referencje powodują błąd w skrypcie Dynamo.

Dalsze poszukiwania nakierowały mnie na wątek z forum Autodesk, gdzie zaproponowano rozwiązanie tego problemu – w C#. Postanowiłem spróbować przełożyć to na funkcję w Pythonie, która mogłaby zadziałać w środowisku Dynamo.

Tak wygląda definicja funkcji pomocniczej „naprawiającej” referencję:

def parseLinkedReference(doc, linkedRef):
	reps = linkedRef.ConvertToStableRepresentation(doc).split(':')			
	res = ''
	first=True				
			
	for i, s in enumerate(reps):
		t = s
		if "RVTLINK" in s:
			if(i<len(reps)-1):
				if reps[i+1]=="0":
					t = "RVTLINK"
				else:
					t = "0:RVTLINK"
			else:
				t = "0:RVTLINK"
		if not first:
			res = res + ":" + t
		else:
			res = t
			first = False
						
	ref = Reference.ParseFromStableRepresentation(doc,res)
	
	return ref

A tak możemy ją zastosować do wymiarowania siatki ściany kurtynowej, podłączonej z zewnętrznego pliku:

refArray = ReferenceArray()

doc = DocumentManager.Instance.CurrentDBDocument

options = Options()
options.ComputeReferences = True
options.IncludeNonVisibleObjects = True

for id in wall.CurtainGrid.GetVGridLineIds():
	objectDoc = wall.Document
	gridLine = objectDoc.GetElement(id)
	gridGeo = gridLine.get_Geometry(options)
	for obj in gridGeo:
		if isinstance(obj,Line):
			linkedReference = obj.Reference.CreateLinkReference(linkedInstance)
			
			ref = parseLinkedReference(doc,linkedReference)
			refArray.Append(ref)


Posts created 32

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top