Cum se determină locația unui element din fișierul conectat în sistemul de coordonate al fișierului principal
Problema este că acest articol descrie modul de obținere a coordonatelor elementului în sistemul de coordonate al fișierului asociat.
Să presupunem că am un dosar asociat, în care există doar un singur perete. În acest fișier, peretele este situat la punctul 100; 100; 0.
În fișierul principal am plasat acest perete la punctul 300; 100; 0.
Trebuie să determin locația peretelui din fișierul conectat în interiorul fișierului principal. Adică vreau să obțin coordonatele 300, 100, 0.
Cum se poate face acest lucru?
Așa cum am spus, codul din articolul de mai sus determină locația peretelui în coordonatele fișierului conectat (100; 100; 0), iar acesta nu este coordonatele de care am nevoie.
Document d = rvtlink. GetLinkDocument # 40; # 41; ;
Elementul e = d. GetElement # 40; id # 41; ;
Locația curbei Curve = e. Locația ca locațieCurve;
XYZ p = curbă. Curve. GetEndPoint # 40; 0 # 41; ;
XYZ q = curba. Curve. GetEndPoint # 40; 1 # 41; ;
Pentru a descrie și a reproduce complet problema mea, am creat două proiecte de testare, A și B, și două pereți - albastru și roșu.
Proiectul A arată astfel:
Proiectul B arată astfel:
Linia roz indică limita proiectului asociat Un fișier în proiectul B.
Proiectul A se află în proiectul B, astfel încât punctul zero al proiectului A să se situeze la punctul 5000, 5000, 0 din proiectul B.
Așa cum am spus, obiectivul meu este de a obține coordonatele locației peretelui roșu (peretele din fișierul conectat), dar în sistemul de coordonate al proiectului B.
Deci, am nevoie de un algoritm cu care să pot determina că peretele roșu este la punctul 5000, 5000, 0, iar cel albastru la punctul -7000, 5000, 0.
Deci, cum se poate face asta?
Iată codul meu unde am încercat să obțin ceea ce am nevoie:
UIAplicarea uiapp = commandData. Aplicație;
UIDocument uidoc = uiapp. ActiveUIDocument;
Document doc = uidoc. Document;
retur Rezultatul. Reușit;
Cum pun în aplicare ultimul pas?
Răspuns. De fapt, este foarte ușor.
Înainte de a detalia detaliile, aș dori să reamintesc că am discutat recent cum să accesez elementele individuale dintr-un fișier legat (în engleză) și acolo am subliniat un număr destul de mare de linkuri către subiecte similare.
Clasa RevitLinkInstance este moștenită de la clasa Instance. Clasa conține metoda GetTransform. cu care puteți obține informații despre transformarea elementului, precum și despre metoda GetTotalTransform. care returnează transformarea curentă a elementului cu direcția spre nord.
După cum ați spus, aveți coordonatele elementului din fișierul conectat, dar trebuie să determinați modul de conversie a acestor coordonate în sistemul de coordonate al fișierului principal.
Acest lucru este ușor de atins utilizând proprietatea Locație a clasei RevitLinkInstance. pentru a determina decalajul coordonatei fișierului asociat față de fișierul principal și apoi să aplicați această compensare coordonatelor pe care le-ați putut obține deja.
Apropo, aș dori să observ că complicați în mod semnificativ depanarea codului, care lucrează cu milimetri în interfața cu utilizatorul, deoarece toate valorile din baza de date a fișierului Revit sunt stocate în picioare.
Am implementat o metodă mică de ajutor numită PointStringMm pentru a afișa unitățile bazei de date în milimetri.
const dublu _inch_to_mm = 25,4;
const dublu _foot_to_mm = 12 * _inch_to_mm;