Umieszczanie elementów na linkowanych obiektach

Niedawno na forum Dynamo pojawiło się ciekawe pytanie dotyczące umieszczania rodzin na obiektach nadrzędnych pochodzących z podłączonych plików. Po krótkim rozeznaniu okazało się, że jest to wykonalne przy pomocy Pythona – wykonując pewne przekształcenia z referencjami do obiektów. Cały proces jest dość podobny jak w przypadku wymiarowania podłączonych obiektów – co było opisane dokładniej w jednym z poprzednich postów: http://lubim.co/pl/2019/02/12/wymiarowanie-podlaczonych-elementow-w-dynamo/

W tym konkretnym wypadku, celem było umieszczenie rodziny instalacji na spodzie sufitu podwieszanego. Poniższy skrypt dla każdego z zadanych elementów nadrzędnych wyszukuje płaszczyznę spodu. Następnie konstruowana jest tzw. referencja linku do tej płaszczyzny (poprzez zdefiniowaną funkcję pomocniczą). I to w zasadzie jest cała magia. Mając taką referencję możemy w standardowy sposób umieścić rodzinę na płaszczyźnie sufitu – tak samo jak gdyby był umieszczony w głównym dokumencie.

 import clr

clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

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


doc = DocumentManager.Instance.CurrentDBDocument
family_type = UnwrapElement(IN[0])
hosts = UnwrapElement(IN[1])
linked_instance = UnwrapElement(IN[2])
output = []

TransactionManager.Instance.EnsureInTransaction(doc)

for h in hosts:
	reference = HostObjectUtils.GetBottomFaces(h)[0]
	linked_reference = reference.CreateLinkReference(linked_instance)
			
	parsed_ref = parseLinkedReference(doc,linked_reference)
	face = h.GetGeometryObjectFromReference(reference)
	bb = face.GetBoundingBox()
	centerUV = bb.Min + (bb.Max-bb.Min)/2
	p = face.Evaluate(centerUV)

	inst = doc.Create.NewFamilyInstance(parsed_ref,p,XYZ(0,0,0),family_type)
	output.append(inst)
	
TransactionManager.Instance.TransactionTaskDone()

#Assign your output to the OUT variable.
OUT = output
Posts created 36

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