diff --git a/src/blenderbim/blenderbim/bim/data/assets/symbols.svg b/src/blenderbim/blenderbim/bim/data/assets/symbols.svg
index 7011554551..5aca6a35eb 100644
--- a/src/blenderbim/blenderbim/bim/data/assets/symbols.svg
+++ b/src/blenderbim/blenderbim/bim/data/assets/symbols.svg
@@ -44,17 +44,22 @@
-
+
-
-
+
+
+
+
+
+
+
-
+
-
+
diff --git a/src/blenderbim/blenderbim/bim/data/libraries/IFC4 Demo Library.ifc b/src/blenderbim/blenderbim/bim/data/libraries/IFC4 Demo Library.ifc
index a86680bbd0..190b13d9a4 100644
--- a/src/blenderbim/blenderbim/bim/data/libraries/IFC4 Demo Library.ifc
+++ b/src/blenderbim/blenderbim/bim/data/libraries/IFC4 Demo Library.ifc
@@ -1,13 +1,13 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1');
-FILE_NAME('/dev/null','2023-07-30T21:07:33+10:00',(),(),'IfcOpenShell v0.7.0-8f41ae0c1','IfcOpenShell v0.7.0-8f41ae0c1','Nobody');
+FILE_NAME('/dev/null','2023-09-02T16:09:02+10:00',(),(),'IfcOpenShell v0.7.0-fbd8ea1ed','IfcOpenShell v0.7.0-fbd8ea1ed','Nobody');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
-#1=IFCPROJECT('0TszJmTqLCyxcP10DtK_MP',$,'BlenderBIM Demo',$,$,$,$,(#12,#16),#7);
-#2=IFCPROJECTLIBRARY('0Y_CJXSsbCgBlSGFw0mbLa',$,'BlenderBIM Demo Library',$,$,$,$,$,$);
-#3=IFCRELDECLARES('3IxQaOPH5Fx90CGmGm1gtQ',$,$,$,#1,(#2));
+#1=IFCPROJECT('1UlLTVwDzDvR$QNEAxFx6F',$,'BlenderBIM Demo',$,$,$,$,(#12,#16),#7);
+#2=IFCPROJECTLIBRARY('3QN02XEh1FQh0fii364VEi',$,'BlenderBIM Demo Library',$,$,$,$,$,$);
+#3=IFCRELDECLARES('0aiEyU5lL7mAdB5xwdXbUN',$,$,$,#1,(#2));
#4=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#5=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#6=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
@@ -25,82 +25,82 @@ DATA;
#18=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Plan',*,*,*,*,#16,$,.PLAN_VIEW.,$);
#19=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Plan',*,*,*,*,#16,$,.PLAN_VIEW.,$);
#20=IFCMATERIAL('Unknown',$,$);
-#21=IFCWALLTYPE('3U0gAUglf9WBlcfpB15EK0',$,'WAL50',$,$,$,$,$,$,.NOTDEFINED.);
+#21=IFCWALLTYPE('0Ir6HewafB2hnPRigxrUnM',$,'WAL50',$,$,$,$,$,$,.NOTDEFINED.);
#22=IFCMATERIALLAYERSET((#24),$,$);
-#23=IFCRELASSOCIATESMATERIAL('3J36H22Gz1ovVzdiKgApaM',$,$,$,(#21),#22);
+#23=IFCRELASSOCIATESMATERIAL('3S$YbWQCnDCA2tmoikSnrh',$,$,$,(#21),#22);
#24=IFCMATERIALLAYER(#20,0.05,$,$,$,$,$);
-#25=IFCRELDECLARES('28ApgMJzH10h$Ng$fmCpYf',$,$,$,#2,(#63,#21,#54,#87,#153,#34,#67,#210,#38,#82,#77,#42,#26,#48,#72,#59,#92,#30,#96));
-#26=IFCWALLTYPE('1wGfdUdC10TuASJo4jnO99',$,'WAL100',$,$,$,$,$,$,.NOTDEFINED.);
+#25=IFCRELDECLARES('1eLCJqssP2kvQIdmPlRK19',$,$,$,#2,(#38,#82,#77,#42,#26,#48,#72,#59,#92,#30,#96,#63,#54,#87,#153,#34,#67,#21,#210));
+#26=IFCWALLTYPE('2oUFJayonDlBTcbJtxYFSv',$,'WAL100',$,$,$,$,$,$,.NOTDEFINED.);
#27=IFCMATERIALLAYERSET((#29),$,$);
-#28=IFCRELASSOCIATESMATERIAL('0NRoxSQPzCgQHfsu5ru91z',$,$,$,(#26),#27);
+#28=IFCRELASSOCIATESMATERIAL('0n3vPKxufDgO48f4yfGtUd',$,$,$,(#26),#27);
#29=IFCMATERIALLAYER(#20,0.1,$,$,$,$,$);
-#30=IFCWALLTYPE('1lt5MuGLLDfwmZd0tNruF7',$,'WAL200',$,$,$,$,$,$,.NOTDEFINED.);
+#30=IFCWALLTYPE('0UDhWxnIXDMOxZ2yPDCUMP',$,'WAL200',$,$,$,$,$,$,.NOTDEFINED.);
#31=IFCMATERIALLAYERSET((#33),$,$);
-#32=IFCRELASSOCIATESMATERIAL('21rGVxPODC$xmWYFaDy1T6',$,$,$,(#30),#31);
+#32=IFCRELASSOCIATESMATERIAL('2Boxz3uaP0LOy6luKau2R0',$,$,$,(#30),#31);
#33=IFCMATERIALLAYER(#20,0.2,$,$,$,$,$);
-#34=IFCWALLTYPE('0NZm1D8h12xAxyW7fL5nc1',$,'WAL300',$,$,$,$,$,$,.NOTDEFINED.);
+#34=IFCWALLTYPE('20fPutWQrFyeMIiKxc$MkU',$,'WAL300',$,$,$,$,$,$,.NOTDEFINED.);
#35=IFCMATERIALLAYERSET((#37),$,$);
-#36=IFCRELASSOCIATESMATERIAL('2yvmN42crCJevtirp5cMeV',$,$,$,(#34),#35);
+#36=IFCRELASSOCIATESMATERIAL('2qAjlTTxjBkvdp80A9XdMZ',$,$,$,(#34),#35);
#37=IFCMATERIALLAYER(#20,0.3,$,$,$,$,$);
-#38=IFCCOVERINGTYPE('1eb4wZ_5n6xRGrs3rlKMiM',$,'COV10',$,$,$,$,$,$,.NOTDEFINED.);
+#38=IFCCOVERINGTYPE('100hdtcxzBdQATomAi0tv5',$,'COV10',$,$,$,$,$,$,.NOTDEFINED.);
#39=IFCMATERIALLAYERSET((#41),$,$);
-#40=IFCRELASSOCIATESMATERIAL('3HKIKf06T6xRqM6Lp69$OM',$,$,$,(#38),#39);
+#40=IFCRELASSOCIATESMATERIAL('3tO1xRn9b06utMa1TZC$WW',$,$,$,(#38),#39);
#41=IFCMATERIALLAYER(#20,0.01,$,$,$,$,$);
-#42=IFCCOVERINGTYPE('2E89aYmtrEfxhX_jsNqviN',$,'COV20',$,$,(#46),$,$,$,.NOTDEFINED.);
+#42=IFCCOVERINGTYPE('1sO51oul95ABWezHr7P7Dk',$,'COV20',$,$,(#46),$,$,$,.NOTDEFINED.);
#43=IFCMATERIALLAYERSET((#45),$,$);
-#44=IFCRELASSOCIATESMATERIAL('2115lEhhP4Z9G1Yhd_DqSC',$,$,$,(#42),#43);
+#44=IFCRELASSOCIATESMATERIAL('0w6lexCg19TuiqqTxo91zc',$,$,$,(#42),#43);
#45=IFCMATERIALLAYER(#20,0.02,$,$,$,$,$);
-#46=IFCPROPERTYSET('0vtU63YmjAgg8DeHlTgNx7',$,'EPset_Parametric',$,(#47));
+#46=IFCPROPERTYSET('3ytgFxH0571uBCG4mBNXI9',$,'EPset_Parametric',$,(#47));
#47=IFCPROPERTYSINGLEVALUE('LayerSetDirection',$,IFCLABEL('AXIS2'),$);
-#48=IFCCOVERINGTYPE('0XiSBI57L9Uf8f2NaQ_ksi',$,'COV30',$,$,(#52),$,$,$,.NOTDEFINED.);
+#48=IFCCOVERINGTYPE('09GKC1aO56qwEPF9halcxJ',$,'COV30',$,$,(#52),$,$,$,.NOTDEFINED.);
#49=IFCMATERIALLAYERSET((#51),$,$);
-#50=IFCRELASSOCIATESMATERIAL('3U3JdGAmbABA4mB$Fgpq1l',$,$,$,(#48),#49);
+#50=IFCRELASSOCIATESMATERIAL('0rDrnpiX58DgQhcURj_WlB',$,$,$,(#48),#49);
#51=IFCMATERIALLAYER(#20,0.03,$,$,$,$,$);
-#52=IFCPROPERTYSET('17nhQ5I4b9ZvhDu4gRJLKO',$,'EPset_Parametric',$,(#53));
+#52=IFCPROPERTYSET('14u6OUyPL5y8O$QkEnB6Rr',$,'EPset_Parametric',$,(#53));
#53=IFCPROPERTYSINGLEVALUE('LayerSetDirection',$,IFCLABEL('AXIS3'),$);
-#54=IFCRAMPTYPE('1BTHjVDP19tgb3MDCSkWCJ',$,'RAM200',$,$,$,$,$,$,.NOTDEFINED.);
+#54=IFCRAMPTYPE('2G4JrZ99j2B9SkIwWDk0sC',$,'RAM200',$,$,$,$,$,$,.NOTDEFINED.);
#55=IFCMATERIALLAYERSET((#57),$,$);
-#56=IFCRELASSOCIATESMATERIAL('3HN21bHtL16vvHA2GnnxH1',$,$,$,(#54),#55);
+#56=IFCRELASSOCIATESMATERIAL('2nNlFzNPj0_h6_NwdVJvW$',$,$,$,(#54),#55);
#57=IFCMATERIALLAYER(#20,0.2,$,$,$,$,$);
#58=IFCCIRCLEPROFILEDEF(.AREA.,$,$,0.3);
-#59=IFCPILETYPE('04_2WZSqH8TgT7ET6DCCpd',$,'P1',$,$,$,$,$,$,.NOTDEFINED.);
+#59=IFCPILETYPE('3uIc5iHjP5Lel3X6KXyN8W',$,'P1',$,$,$,$,$,$,.NOTDEFINED.);
#60=IFCMATERIALPROFILESET($,$,(#62),$);
-#61=IFCRELASSOCIATESMATERIAL('1qTZZRXsPF9hmYwT$tgFgp',$,$,$,(#59),#60);
+#61=IFCRELASSOCIATESMATERIAL('13buLvs1r5vAyhgbabb2g1',$,$,$,(#59),#60);
#62=IFCMATERIALPROFILE($,$,#20,#58,$,$);
-#63=IFCSLABTYPE('3_OV9$Sd52KRhIW2TWIxbW',$,'FLR150',$,$,$,$,$,$,.NOTDEFINED.);
+#63=IFCSLABTYPE('2CbahfxvnFpPoHyMBpGTQm',$,'FLR150',$,$,$,$,$,$,.NOTDEFINED.);
#64=IFCMATERIALLAYERSET((#66),$,$);
-#65=IFCRELASSOCIATESMATERIAL('1agyf45$X1NhR127pUL0Iw',$,$,$,(#63),#64);
+#65=IFCRELASSOCIATESMATERIAL('2Irb7$9xL8YOXW99sF0SOp',$,$,$,(#63),#64);
#66=IFCMATERIALLAYER(#20,0.2,$,$,$,$,$);
-#67=IFCSLABTYPE('0LvmpIGf9AVPcG$Kt06TEk',$,'FLR250',$,$,$,$,$,$,.NOTDEFINED.);
+#67=IFCSLABTYPE('04dx2Vg4vEp9ZOKGI1ifWb',$,'FLR250',$,$,$,$,$,$,.NOTDEFINED.);
#68=IFCMATERIALLAYERSET((#70),$,$);
-#69=IFCRELASSOCIATESMATERIAL('0EKQPSL656secN86SgeutH',$,$,$,(#67),#68);
+#69=IFCRELASSOCIATESMATERIAL('04tl3Me6T6xOb$WEvv_dL0',$,$,$,(#67),#68);
#70=IFCMATERIALLAYER(#20,0.3,$,$,$,$,$);
#71=IFCRECTANGLEPROFILEDEF(.AREA.,'500x600',$,0.5,0.6);
-#72=IFCCOLUMNTYPE('1SI8m9m813tAXfSnM1fCbm',$,'C1',$,$,$,$,$,$,.NOTDEFINED.);
+#72=IFCCOLUMNTYPE('13rk_6wmDApeVQWfrArKbl',$,'C1',$,$,$,$,$,$,.NOTDEFINED.);
#73=IFCMATERIALPROFILESET($,$,(#75),$);
-#74=IFCRELASSOCIATESMATERIAL('1EhwSTRtPBQgBt2x6dhuT$',$,$,$,(#72),#73);
+#74=IFCRELASSOCIATESMATERIAL('0X3OUScT9E1BjOvJWiUrv3',$,$,$,(#72),#73);
#75=IFCMATERIALPROFILE($,$,#20,#71,$,$);
#76=IFCCIRCLEHOLLOWPROFILEDEF(.AREA.,'500.0x5.0 CHS',$,0.25,0.005);
-#77=IFCCOLUMNTYPE('25GZwy2zLFcgi57r5S8iY3',$,'C2',$,$,$,$,$,$,.NOTDEFINED.);
+#77=IFCCOLUMNTYPE('0IaS5T1Uv6DQu$BJ5I3bks',$,'C2',$,$,$,$,$,$,.NOTDEFINED.);
#78=IFCMATERIALPROFILESET($,$,(#80),$);
-#79=IFCRELASSOCIATESMATERIAL('2VURAOhz93ZQqT9YJUA1DO',$,$,$,(#77),#78);
+#79=IFCRELASSOCIATESMATERIAL('1HWcDe7a17WwPeKCHnckid',$,$,$,(#77),#78);
#80=IFCMATERIALPROFILE($,$,#20,#76,$,$);
#81=IFCRECTANGLEHOLLOWPROFILEDEF(.AREA.,'150x75x2.0 RHS',$,0.075,0.15,0.002,0.005,0.005);
-#82=IFCCOLUMNTYPE('1Wg$I84s9BTh$iDuZnmSkH',$,'C3',$,$,$,$,$,$,.NOTDEFINED.);
+#82=IFCCOLUMNTYPE('13p6$J2Jv84RFI5QAp6FTQ',$,'C3',$,$,$,$,$,$,.NOTDEFINED.);
#83=IFCMATERIALPROFILESET($,$,(#85),$);
-#84=IFCRELASSOCIATESMATERIAL('3fIIwEe7DAle7x_zISvMUD',$,$,$,(#82),#83);
+#84=IFCRELASSOCIATESMATERIAL('1GWCzHY657$9kUJrD0AEir',$,$,$,(#82),#83);
#85=IFCMATERIALPROFILE($,$,#20,#81,$,$);
#86=IFCISHAPEPROFILEDEF(.AREA.,'DEMO-I',$,0.1,0.2,0.005,0.01,0.005,$,$);
-#87=IFCBEAMTYPE('2yg2Irs7L26gFsD_AvvFUu',$,'B1',$,$,$,$,$,$,.NOTDEFINED.);
+#87=IFCBEAMTYPE('1Y_PtOyJP9YfZkU59r$vs1',$,'B1',$,$,$,$,$,$,.NOTDEFINED.);
#88=IFCMATERIALPROFILESET($,$,(#90),$);
-#89=IFCRELASSOCIATESMATERIAL('1PU_gbkifF9hYpi9DvXTAU',$,$,$,(#87),#88);
+#89=IFCRELASSOCIATESMATERIAL('2CfmfKJ0X45xijxsDUHZ85',$,$,$,(#87),#88);
#90=IFCMATERIALPROFILE($,$,#20,#86,$,$);
#91=IFCCSHAPEPROFILEDEF(.AREA.,'DEMO-C',$,0.2,0.1,0.0015,0.03,0.005);
-#92=IFCBEAMTYPE('2Nf2L5qpz8K8KhUNFBg_fT',$,'B2',$,$,$,$,$,$,.NOTDEFINED.);
+#92=IFCBEAMTYPE('2qogXGNrb9EANilnZjnGjq',$,'B2',$,$,$,$,$,$,.NOTDEFINED.);
#93=IFCMATERIALPROFILESET($,$,(#95),$);
-#94=IFCRELASSOCIATESMATERIAL('1SgarGNCzEQQpfs29NMq0y',$,$,$,(#92),#93);
+#94=IFCRELASSOCIATESMATERIAL('3$1pGIrVLA2RTOmJIsbelu',$,$,$,(#92),#93);
#95=IFCMATERIALPROFILE($,$,#20,#91,$,$);
-#96=IFCWINDOWTYPE('2zRUFP8Ef81xDOR2iJx1zK',$,'WT01',$,$,$,(#135,#152),$,$,.NOTDEFINED.,.NOTDEFINED.,$,$);
+#96=IFCWINDOWTYPE('1Dc9pAExL3fxL9jScEo2EF',$,'WT01',$,$,$,(#135,#152),$,$,.NOTDEFINED.,.NOTDEFINED.,$,$);
#97=IFCINDEXEDPOLYGONALFACE((13,17,18,14));
#98=IFCINDEXEDPOLYGONALFACE((5,6,3,4));
#99=IFCINDEXEDPOLYGONALFACE((7,8,2,1));
@@ -157,7 +157,7 @@ DATA;
#150=IFCDIRECTION((0.,0.,1.));
#151=IFCAXIS2PLACEMENT3D(#148,#150,#149);
#152=IFCREPRESENTATIONMAP(#151,#147);
-#153=IFCDOORTYPE('0oekOIA$z8lxWiQs9_tFWU',$,'DT01',$,$,$,(#196,#209),$,$,.NOTDEFINED.,.NOTDEFINED.,$,$);
+#153=IFCDOORTYPE('05Z1DhJjj11wczPRkvXSPE',$,'DT01',$,$,$,(#196,#209),$,$,.NOTDEFINED.,.NOTDEFINED.,$,$);
#154=IFCINDEXEDPOLYGONALFACE((17,16,15,14));
#155=IFCINDEXEDPOLYGONALFACE((2,3,29,28));
#156=IFCINDEXEDPOLYGONALFACE((27,28,29,30,32,31));
@@ -214,7 +214,7 @@ DATA;
#207=IFCDIRECTION((0.,0.,1.));
#208=IFCAXIS2PLACEMENT3D(#205,#207,#206);
#209=IFCREPRESENTATIONMAP(#208,#204);
-#210=IFCFURNITURETYPE('0I2mc$m3T60hLXZYg9Y1wu',$,'BUN01',$,$,$,(#931,#952),$,$,.NOTDEFINED.,.NOTDEFINED.);
+#210=IFCFURNITURETYPE('3ZMmSB_rfBnhrBckPTFKvP',$,'BUN01',$,$,$,(#931,#952),$,$,.NOTDEFINED.,.NOTDEFINED.);
#211=IFCINDEXEDPOLYGONALFACE((187,278,44));
#212=IFCINDEXEDPOLYGONALFACE((21,52,60));
#213=IFCINDEXEDPOLYGONALFACE((91,100,31));
@@ -957,131 +957,140 @@ DATA;
#950=IFCDIRECTION((0.,0.,1.));
#951=IFCAXIS2PLACEMENT3D(#948,#950,#949);
#952=IFCREPRESENTATIONMAP(#951,#947);
-#953=IFCTYPEPRODUCT('2be705eyD4DPBr6j4K7ZEx',$,'DASHED',$,'IfcAnnotation/LINEWORK',(#954),$,$);
-#954=IFCPROPERTYSET('0uEfutIxDDIxMIBUJOZpSM',$,'EPset_Annotation',$,(#955));
-#955=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('dashed'),$);
-#956=IFCTYPEPRODUCT('1M7mm9wUHFoxdM0MdAMyqM',$,'FINE',$,'IfcAnnotation/LINEWORK',(#957),$,$);
-#957=IFCPROPERTYSET('3AZ8m1Bdn1gfbvagzKr2c3',$,'EPset_Annotation',$,(#958));
-#958=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('fine'),$);
-#959=IFCTYPEPRODUCT('3LdrNIFOvAkBzrNnqWAZfA',$,'THIN',$,'IfcAnnotation/LINEWORK',(#960),$,$);
-#960=IFCPROPERTYSET('0$9iwgSID7xBul4Tb9r2du',$,'EPset_Annotation',$,(#961));
-#961=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('thin'),$);
-#962=IFCTYPEPRODUCT('3fFNO0t1TB$wYRaIkKwUCH',$,'MEDIUM',$,'IfcAnnotation/LINEWORK',(#963),$,$);
-#963=IFCPROPERTYSET('33Fm$9zgb1cgsCOy859RlR',$,'EPset_Annotation',$,(#964));
-#964=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('medium'),$);
-#965=IFCTYPEPRODUCT('1CpMBhemj5VQC43bU9J7zG',$,'THICK',$,'IfcAnnotation/LINEWORK',(#966),$,$);
-#966=IFCPROPERTYSET('1OLDsFSDz2TPz5ifkQvWo8',$,'EPset_Annotation',$,(#967));
-#967=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('thick'),$);
-#968=IFCTYPEPRODUCT('0NITtya3b16hoA3sh17SL4',$,'STRONG',$,'IfcAnnotation/LINEWORK',(#969),$,$);
-#969=IFCPROPERTYSET('1_kfqWVDn0puI29Ah6eitX',$,'EPset_Annotation',$,(#970));
-#970=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('strong'),$);
-#971=IFCTYPEPRODUCT('0rRN9EsvL5AQ3PorxrZSKM',$,'DOOR-TAG',$,'IfcAnnotation/TEXT',(#972),(#991),$);
-#972=IFCPROPERTYSET('3lRZ$d2VH8cxZYh$mm45iq',$,'EPset_Annotation',$,(#973));
-#973=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('door-tag'),$);
-#974=IFCCARTESIANPOINT((0.,0.,0.));
-#975=IFCDIRECTION((0.,0.,1.));
-#976=IFCDIRECTION((1.,0.,0.));
-#977=IFCAXIS2PLACEMENT3D(#974,#975,#976);
-#978=IFCPLANAREXTENT(1000.,1000.);
-#979=IFCTEXTLITERALWITHEXTENT('{{type.Name}}',#977,.RIGHT.,#978,'center');
-#980=IFCCARTESIANPOINT((0.,0.,0.));
-#981=IFCDIRECTION((0.,0.,1.));
-#982=IFCDIRECTION((1.,0.,0.));
-#983=IFCAXIS2PLACEMENT3D(#980,#981,#982);
-#984=IFCPLANAREXTENT(1000.,1000.);
-#985=IFCTEXTLITERALWITHEXTENT('{{Name}}',#983,.RIGHT.,#984,'center');
-#986=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#979,#985));
-#987=IFCCARTESIANPOINT((0.,0.,0.));
-#988=IFCDIRECTION((1.,0.,0.));
-#989=IFCDIRECTION((0.,0.,1.));
-#990=IFCAXIS2PLACEMENT3D(#987,#989,#988);
-#991=IFCREPRESENTATIONMAP(#990,#986);
-#992=IFCTYPEPRODUCT('0bFZUWHjbA2e03hRHNinTt',$,'WINDOW-TAG',$,'IfcAnnotation/TEXT',(#993),(#1006),$);
-#993=IFCPROPERTYSET('3TJOWv5NDBXBNCshYFjsFV',$,'EPset_Annotation',$,(#994));
-#994=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('window-tag'),$);
-#995=IFCCARTESIANPOINT((0.,0.,0.));
-#996=IFCDIRECTION((0.,0.,1.));
+#953=IFCTYPEPRODUCT('1hmWolVQb9buX2GhHwaVFB',$,'SETOUT-POINT',$,'IfcAnnotation/SYMBOL',(#954),$,$);
+#954=IFCPROPERTYSET('2YNCFr62b8vhuhHGspQl4$',$,'EPset_Annotation',$,(#955));
+#955=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('setout-point'),$);
+#956=IFCTYPEPRODUCT('3H4oE1a_9AwQE8OFsCjdfh',$,'CONTROL-POINT',$,'IfcAnnotation/SYMBOL',(#957),$,$);
+#957=IFCPROPERTYSET('0ARWSOH$z3kQDRkpEPHWCt',$,'EPset_Annotation',$,(#958));
+#958=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('control-point'),$);
+#959=IFCTYPEPRODUCT('3YDPnyrWn2wRWgRzb0V7Kx',$,'TRAVERSE-POINT',$,'IfcAnnotation/SYMBOL',(#960),$,$);
+#960=IFCPROPERTYSET('1v$MzHU1b82hDqHdtz4e5y',$,'EPset_Annotation',$,(#961));
+#961=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('traverse-point'),$);
+#962=IFCTYPEPRODUCT('31Em8$VNL0Mh$9EZ3pXjpL',$,'DASHED',$,'IfcAnnotation/LINEWORK',(#963),$,$);
+#963=IFCPROPERTYSET('0K84$piRb31PmkAwZfP5kd',$,'EPset_Annotation',$,(#964));
+#964=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('dashed'),$);
+#965=IFCTYPEPRODUCT('3P0K0gDxP4NgwnuLGqlyW6',$,'FINE',$,'IfcAnnotation/LINEWORK',(#966),$,$);
+#966=IFCPROPERTYSET('179vwKcVv9uet4_kI4NT9G',$,'EPset_Annotation',$,(#967));
+#967=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('fine'),$);
+#968=IFCTYPEPRODUCT('0Rh30iszn41xBCgQJl2w2c',$,'THIN',$,'IfcAnnotation/LINEWORK',(#969),$,$);
+#969=IFCPROPERTYSET('0bZV_Tby121uj5O3n08l1l',$,'EPset_Annotation',$,(#970));
+#970=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('thin'),$);
+#971=IFCTYPEPRODUCT('3ti_6xztr7qPp9dASz9vP4',$,'MEDIUM',$,'IfcAnnotation/LINEWORK',(#972),$,$);
+#972=IFCPROPERTYSET('19ZhF3bxL07evL8gi27Kei',$,'EPset_Annotation',$,(#973));
+#973=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('medium'),$);
+#974=IFCTYPEPRODUCT('2hlcxjzxv8zf0gh1md23xY',$,'THICK',$,'IfcAnnotation/LINEWORK',(#975),$,$);
+#975=IFCPROPERTYSET('0wRtpbInzE2AkqX8RIreQr',$,'EPset_Annotation',$,(#976));
+#976=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('thick'),$);
+#977=IFCTYPEPRODUCT('1pefU$PA1ENw7kZG9T3mjr',$,'STRONG',$,'IfcAnnotation/LINEWORK',(#978),$,$);
+#978=IFCPROPERTYSET('1RpJZBysn8shqevvAquPQ8',$,'EPset_Annotation',$,(#979));
+#979=IFCPROPERTYSINGLEVALUE('Classes',$,IFCLABEL('strong'),$);
+#980=IFCTYPEPRODUCT('1HKC8zCIv5_ef3dEfa$L5N',$,'DOOR-TAG',$,'IfcAnnotation/TEXT',(#981),(#1000),$);
+#981=IFCPROPERTYSET('0aC8JrqFX6HhKUhjdLw4mN',$,'EPset_Annotation',$,(#982));
+#982=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('door-tag'),$);
+#983=IFCCARTESIANPOINT((0.,0.,0.));
+#984=IFCDIRECTION((0.,0.,1.));
+#985=IFCDIRECTION((1.,0.,0.));
+#986=IFCAXIS2PLACEMENT3D(#983,#984,#985);
+#987=IFCPLANAREXTENT(1000.,1000.);
+#988=IFCTEXTLITERALWITHEXTENT('{{type.Name}}',#986,.RIGHT.,#987,'center');
+#989=IFCCARTESIANPOINT((0.,0.,0.));
+#990=IFCDIRECTION((0.,0.,1.));
+#991=IFCDIRECTION((1.,0.,0.));
+#992=IFCAXIS2PLACEMENT3D(#989,#990,#991);
+#993=IFCPLANAREXTENT(1000.,1000.);
+#994=IFCTEXTLITERALWITHEXTENT('{{Name}}',#992,.RIGHT.,#993,'center');
+#995=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#988,#994));
+#996=IFCCARTESIANPOINT((0.,0.,0.));
#997=IFCDIRECTION((1.,0.,0.));
-#998=IFCAXIS2PLACEMENT3D(#995,#996,#997);
-#999=IFCPLANAREXTENT(1000.,1000.);
-#1000=IFCTEXTLITERALWITHEXTENT('{{Name}}',#998,.RIGHT.,#999,'center');
-#1001=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1000));
-#1002=IFCCARTESIANPOINT((0.,0.,0.));
-#1003=IFCDIRECTION((1.,0.,0.));
-#1004=IFCDIRECTION((0.,0.,1.));
-#1005=IFCAXIS2PLACEMENT3D(#1002,#1004,#1003);
-#1006=IFCREPRESENTATIONMAP(#1005,#1001);
-#1007=IFCTYPEPRODUCT('2DlmDdasX05un_uMP4O23U',$,'SPACE-TAG',$,'IfcAnnotation/TEXT',(#1008),(#1033),$);
-#1008=IFCPROPERTYSET('1$OAHURHr3GON7ZzAJnv72',$,'EPset_Annotation',$,(#1009));
-#1009=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('space-tag'),$);
-#1010=IFCCARTESIANPOINT((0.,0.,0.));
-#1011=IFCDIRECTION((0.,0.,1.));
+#998=IFCDIRECTION((0.,0.,1.));
+#999=IFCAXIS2PLACEMENT3D(#996,#998,#997);
+#1000=IFCREPRESENTATIONMAP(#999,#995);
+#1001=IFCTYPEPRODUCT('2Jy_wl$FX8h9mgYT1$Y9oc',$,'WINDOW-TAG',$,'IfcAnnotation/TEXT',(#1002),(#1015),$);
+#1002=IFCPROPERTYSET('2ncCyO$LPCzv7kqXZK_Omh',$,'EPset_Annotation',$,(#1003));
+#1003=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('window-tag'),$);
+#1004=IFCCARTESIANPOINT((0.,0.,0.));
+#1005=IFCDIRECTION((0.,0.,1.));
+#1006=IFCDIRECTION((1.,0.,0.));
+#1007=IFCAXIS2PLACEMENT3D(#1004,#1005,#1006);
+#1008=IFCPLANAREXTENT(1000.,1000.);
+#1009=IFCTEXTLITERALWITHEXTENT('{{Name}}',#1007,.RIGHT.,#1008,'center');
+#1010=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1009));
+#1011=IFCCARTESIANPOINT((0.,0.,0.));
#1012=IFCDIRECTION((1.,0.,0.));
-#1013=IFCAXIS2PLACEMENT3D(#1010,#1011,#1012);
-#1014=IFCPLANAREXTENT(1000.,1000.);
-#1015=IFCTEXTLITERALWITHEXTENT('{{Name}}',#1013,.RIGHT.,#1014,'center');
-#1016=IFCCARTESIANPOINT((0.,0.,0.));
-#1017=IFCDIRECTION((0.,0.,1.));
-#1018=IFCDIRECTION((1.,0.,0.));
-#1019=IFCAXIS2PLACEMENT3D(#1016,#1017,#1018);
-#1020=IFCPLANAREXTENT(1000.,1000.);
-#1021=IFCTEXTLITERALWITHEXTENT('{{Description}}',#1019,.RIGHT.,#1020,'center');
-#1022=IFCCARTESIANPOINT((0.,0.,0.));
-#1023=IFCDIRECTION((0.,0.,1.));
-#1024=IFCDIRECTION((1.,0.,0.));
-#1025=IFCAXIS2PLACEMENT3D(#1022,#1023,#1024);
-#1026=IFCPLANAREXTENT(1000.,1000.);
-#1027=IFCTEXTLITERALWITHEXTENT('``round({{Qto_SpaceBaseQuantities.NetFloorArea}} or 0., 2)``',#1025,.RIGHT.,#1026,'center');
-#1028=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1015,#1021,#1027));
-#1029=IFCCARTESIANPOINT((0.,0.,0.));
-#1030=IFCDIRECTION((1.,0.,0.));
-#1031=IFCDIRECTION((0.,0.,1.));
-#1032=IFCAXIS2PLACEMENT3D(#1029,#1031,#1030);
-#1033=IFCREPRESENTATIONMAP(#1032,#1028);
-#1034=IFCTYPEPRODUCT('2vNx3CIlrFs8bLFlmGvJF3',$,'MATERIAL-TAG',$,'IfcAnnotation/TEXT',(#1035),(#1048),$);
-#1035=IFCPROPERTYSET('1l$T4lUqnBb93zcgfbSPvx',$,'EPset_Annotation',$,(#1036));
-#1036=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('rectangle-tag'),$);
-#1037=IFCCARTESIANPOINT((0.,0.,0.));
-#1038=IFCDIRECTION((0.,0.,1.));
+#1013=IFCDIRECTION((0.,0.,1.));
+#1014=IFCAXIS2PLACEMENT3D(#1011,#1013,#1012);
+#1015=IFCREPRESENTATIONMAP(#1014,#1010);
+#1016=IFCTYPEPRODUCT('1LTLrGzxH4qhuWGNeTlTRi',$,'SPACE-TAG',$,'IfcAnnotation/TEXT',(#1017),(#1042),$);
+#1017=IFCPROPERTYSET('2JpTIsSZf3zQUWK48RLIcL',$,'EPset_Annotation',$,(#1018));
+#1018=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('space-tag'),$);
+#1019=IFCCARTESIANPOINT((0.,0.,0.));
+#1020=IFCDIRECTION((0.,0.,1.));
+#1021=IFCDIRECTION((1.,0.,0.));
+#1022=IFCAXIS2PLACEMENT3D(#1019,#1020,#1021);
+#1023=IFCPLANAREXTENT(1000.,1000.);
+#1024=IFCTEXTLITERALWITHEXTENT('{{Name}}',#1022,.RIGHT.,#1023,'center');
+#1025=IFCCARTESIANPOINT((0.,0.,0.));
+#1026=IFCDIRECTION((0.,0.,1.));
+#1027=IFCDIRECTION((1.,0.,0.));
+#1028=IFCAXIS2PLACEMENT3D(#1025,#1026,#1027);
+#1029=IFCPLANAREXTENT(1000.,1000.);
+#1030=IFCTEXTLITERALWITHEXTENT('{{Description}}',#1028,.RIGHT.,#1029,'center');
+#1031=IFCCARTESIANPOINT((0.,0.,0.));
+#1032=IFCDIRECTION((0.,0.,1.));
+#1033=IFCDIRECTION((1.,0.,0.));
+#1034=IFCAXIS2PLACEMENT3D(#1031,#1032,#1033);
+#1035=IFCPLANAREXTENT(1000.,1000.);
+#1036=IFCTEXTLITERALWITHEXTENT('``round({{Qto_SpaceBaseQuantities.NetFloorArea}} or 0., 2)``',#1034,.RIGHT.,#1035,'center');
+#1037=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1024,#1030,#1036));
+#1038=IFCCARTESIANPOINT((0.,0.,0.));
#1039=IFCDIRECTION((1.,0.,0.));
-#1040=IFCAXIS2PLACEMENT3D(#1037,#1038,#1039);
-#1041=IFCPLANAREXTENT(1000.,1000.);
-#1042=IFCTEXTLITERALWITHEXTENT('{{material.Name}}',#1040,.RIGHT.,#1041,'center');
-#1043=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1042));
-#1044=IFCCARTESIANPOINT((0.,0.,0.));
-#1045=IFCDIRECTION((1.,0.,0.));
-#1046=IFCDIRECTION((0.,0.,1.));
-#1047=IFCAXIS2PLACEMENT3D(#1044,#1046,#1045);
-#1048=IFCREPRESENTATIONMAP(#1047,#1043);
-#1049=IFCTYPEPRODUCT('3hqzFtbSb56RjhAZNaB4Vh',$,'TYPE-TAG',$,'IfcAnnotation/TEXT',(#1050),(#1063),$);
-#1050=IFCPROPERTYSET('3U7kaKt_nBUvD$U2ryif_H',$,'EPset_Annotation',$,(#1051));
-#1051=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('capsule-tag'),$);
-#1052=IFCCARTESIANPOINT((0.,0.,0.));
-#1053=IFCDIRECTION((0.,0.,1.));
+#1040=IFCDIRECTION((0.,0.,1.));
+#1041=IFCAXIS2PLACEMENT3D(#1038,#1040,#1039);
+#1042=IFCREPRESENTATIONMAP(#1041,#1037);
+#1043=IFCTYPEPRODUCT('3Or$DhaVf6ygGBUpRb2PMs',$,'MATERIAL-TAG',$,'IfcAnnotation/TEXT',(#1044),(#1057),$);
+#1044=IFCPROPERTYSET('2YfvIc6dPDdwWjERHZZlof',$,'EPset_Annotation',$,(#1045));
+#1045=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('rectangle-tag'),$);
+#1046=IFCCARTESIANPOINT((0.,0.,0.));
+#1047=IFCDIRECTION((0.,0.,1.));
+#1048=IFCDIRECTION((1.,0.,0.));
+#1049=IFCAXIS2PLACEMENT3D(#1046,#1047,#1048);
+#1050=IFCPLANAREXTENT(1000.,1000.);
+#1051=IFCTEXTLITERALWITHEXTENT('{{material.Name}}',#1049,.RIGHT.,#1050,'center');
+#1052=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1051));
+#1053=IFCCARTESIANPOINT((0.,0.,0.));
#1054=IFCDIRECTION((1.,0.,0.));
-#1055=IFCAXIS2PLACEMENT3D(#1052,#1053,#1054);
-#1056=IFCPLANAREXTENT(1000.,1000.);
-#1057=IFCTEXTLITERALWITHEXTENT('{{type.Name}}',#1055,.RIGHT.,#1056,'center');
-#1058=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1057));
-#1059=IFCCARTESIANPOINT((0.,0.,0.));
-#1060=IFCDIRECTION((1.,0.,0.));
-#1061=IFCDIRECTION((0.,0.,1.));
-#1062=IFCAXIS2PLACEMENT3D(#1059,#1061,#1060);
-#1063=IFCREPRESENTATIONMAP(#1062,#1058);
-#1064=IFCTYPEPRODUCT('2SnSxJPiD9sh$NDx92OCSS',$,'NAME-TAG',$,'IfcAnnotation/TEXT',(#1065),(#1078),$);
-#1065=IFCPROPERTYSET('3Lu86QVuv5nfjkuPLvdQSH',$,'EPset_Annotation',$,(#1066));
-#1066=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('capsule-tag'),$);
-#1067=IFCCARTESIANPOINT((0.,0.,0.));
-#1068=IFCDIRECTION((0.,0.,1.));
+#1055=IFCDIRECTION((0.,0.,1.));
+#1056=IFCAXIS2PLACEMENT3D(#1053,#1055,#1054);
+#1057=IFCREPRESENTATIONMAP(#1056,#1052);
+#1058=IFCTYPEPRODUCT('01Hhk_DbjDROhyr91Hp$aV',$,'TYPE-TAG',$,'IfcAnnotation/TEXT',(#1059),(#1072),$);
+#1059=IFCPROPERTYSET('0LyRD7lHr17uJo7XNzCvZq',$,'EPset_Annotation',$,(#1060));
+#1060=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('capsule-tag'),$);
+#1061=IFCCARTESIANPOINT((0.,0.,0.));
+#1062=IFCDIRECTION((0.,0.,1.));
+#1063=IFCDIRECTION((1.,0.,0.));
+#1064=IFCAXIS2PLACEMENT3D(#1061,#1062,#1063);
+#1065=IFCPLANAREXTENT(1000.,1000.);
+#1066=IFCTEXTLITERALWITHEXTENT('{{type.Name}}',#1064,.RIGHT.,#1065,'center');
+#1067=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1066));
+#1068=IFCCARTESIANPOINT((0.,0.,0.));
#1069=IFCDIRECTION((1.,0.,0.));
-#1070=IFCAXIS2PLACEMENT3D(#1067,#1068,#1069);
-#1071=IFCPLANAREXTENT(1000.,1000.);
-#1072=IFCTEXTLITERALWITHEXTENT('{{Name}}',#1070,.RIGHT.,#1071,'center');
-#1073=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1072));
-#1074=IFCCARTESIANPOINT((0.,0.,0.));
-#1075=IFCDIRECTION((1.,0.,0.));
-#1076=IFCDIRECTION((0.,0.,1.));
-#1077=IFCAXIS2PLACEMENT3D(#1074,#1076,#1075);
-#1078=IFCREPRESENTATIONMAP(#1077,#1073);
+#1070=IFCDIRECTION((0.,0.,1.));
+#1071=IFCAXIS2PLACEMENT3D(#1068,#1070,#1069);
+#1072=IFCREPRESENTATIONMAP(#1071,#1067);
+#1073=IFCTYPEPRODUCT('0a8MHfTUzA5AV8H6p1bqC9',$,'NAME-TAG',$,'IfcAnnotation/TEXT',(#1074),(#1087),$);
+#1074=IFCPROPERTYSET('2EboL9u1j68Q_Mp8dBa7ux',$,'EPset_Annotation',$,(#1075));
+#1075=IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('capsule-tag'),$);
+#1076=IFCCARTESIANPOINT((0.,0.,0.));
+#1077=IFCDIRECTION((0.,0.,1.));
+#1078=IFCDIRECTION((1.,0.,0.));
+#1079=IFCAXIS2PLACEMENT3D(#1076,#1077,#1078);
+#1080=IFCPLANAREXTENT(1000.,1000.);
+#1081=IFCTEXTLITERALWITHEXTENT('{{Name}}',#1079,.RIGHT.,#1080,'center');
+#1082=IFCSHAPEREPRESENTATION(#19,'Annotation','Annotation2D',(#1081));
+#1083=IFCCARTESIANPOINT((0.,0.,0.));
+#1084=IFCDIRECTION((1.,0.,0.));
+#1085=IFCDIRECTION((0.,0.,1.));
+#1086=IFCAXIS2PLACEMENT3D(#1083,#1085,#1084);
+#1087=IFCREPRESENTATIONMAP(#1086,#1082);
ENDSEC;
END-ISO-10303-21;
diff --git a/src/blenderbim/blenderbim/bim/module/drawing/annotation.py b/src/blenderbim/blenderbim/bim/module/drawing/annotation.py
index 9188291f40..a4473764cc 100644
--- a/src/blenderbim/blenderbim/bim/module/drawing/annotation.py
+++ b/src/blenderbim/blenderbim/bim/module/drawing/annotation.py
@@ -92,6 +92,15 @@ class Annotator:
return obj
+ @staticmethod
+ def add_vertex_to_annotation(obj):
+ verts_world_space = Annotator.get_placeholder_coords()
+ vert_local = obj.matrix_world.inverted() @ verts_world_space[0]
+ bm = tool.Blender.get_bmesh_for_mesh(obj.data, clean=True)
+ bm.verts.new(vert_local)
+ tool.Blender.apply_bmesh(obj.data, bm, obj)
+ return obj
+
@staticmethod
def add_plane_to_annotation(obj, remove_face=False):
# default order = bot left, top left, bot right, top right
@@ -144,6 +153,8 @@ class Annotator:
data = bpy.data.curves.new(object_type, type="CURVE")
data.dimensions = "3D"
data.resolution_u = 2
+ elif data_type == "empty":
+ data = None
obj = bpy.data.objects.new(object_type, data)
obj.matrix_world = matrix_world
diff --git a/src/blenderbim/blenderbim/bim/module/drawing/prop.py b/src/blenderbim/blenderbim/bim/module/drawing/prop.py
index cab0f75ddc..0578ff8105 100644
--- a/src/blenderbim/blenderbim/bim/module/drawing/prop.py
+++ b/src/blenderbim/blenderbim/bim/module/drawing/prop.py
@@ -502,6 +502,8 @@ ANNOTATION_TYPES_DATA = {
"PLAN_LEVEL": ("Level (Plan)", "", "SORTBYEXT", "curve"),
"SECTION_LEVEL": ("Level (Section)", "", "TRIA_DOWN", "curve"),
"BREAKLINE": ("Breakline", "", "FCURVE", "mesh"),
+ "SYMBOL": ("Symbol", "", "KEYFRAME", "empty"),
+ "MULTI_SYMBOL": ("Multi-Symbol", "", "OUTLINER_DATA_POINTCLOUD", "mesh"),
"LINEWORK": ("Line", "", "SNAP_MIDPOINT", "mesh"),
"BATTING": ("Batting", "Add batting annotation.\nThickness could be changed through Thickness property of BBIM_Batting property set", "FORCE_FORCE", "mesh"),
"REVISION_CLOUD":("Revision Cloud", "Add revision cloud", "VOLUME_DATA", "mesh"),
diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py
index a987157c63..23cbf1ab0f 100644
--- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py
+++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py
@@ -326,11 +326,12 @@ class SvgWriter:
# We have to decide whether this should come from Blender or from IFC.
# For the moment, for convenience of experimenting with ideas, it comes
# from Blender. In the future, it should probably come from IFC.
- if not isinstance(obj.data, bpy.types.Mesh):
- return
-
classes = self.get_attribute_classes(obj)
- if len(obj.data.vertices) and not len(obj.data.edges):
+ if obj.data is None:
+ return self.draw_empty_annotation(obj, classes)
+ elif not isinstance(obj.data, bpy.types.Mesh):
+ return
+ elif len(obj.data.vertices) and not len(obj.data.edges):
return self.draw_point_annotation(obj, classes)
elif len(obj.data.polygons) == 0:
return self.draw_edge_annotation(obj, classes)
@@ -862,6 +863,27 @@ class SvgWriter:
self.svg.add(tag)
line_number += len(tag.elements)
+ def draw_empty_annotation(self, obj, classes):
+ x_offset = self.raw_width / 2
+ y_offset = self.raw_height / 2
+
+ point = self.project_point_onto_camera(obj.matrix_world.translation)
+
+ element = tool.Ifc.get_entity(obj)
+ svg_id = ifcopenshell.util.element.get_pset(element, "EPset_Annotation", "Symbol")
+ if not svg_id:
+ # EPset_AnnotationSurveyArea is not standard! See bSI-4.3 proposal #660.
+ svg_id = ifcopenshell.util.element.get_pset(element, "EPset_AnnotationSurveyArea", "PointType")
+ if not svg_id:
+ svg_id = str(ifcopenshell.util.element.get_predefined_type(element))
+ if not svg_id:
+ return
+
+ point = Vector(((x_offset + point.x), (y_offset - point.y)))
+ symbol_position_svg = point * self.svg_scale
+ self.svg.add(self.svg.use(f"#{svg_id}", insert=symbol_position_svg))
+
+
def draw_point_annotation(self, obj, classes):
x_offset = self.raw_width / 2
y_offset = self.raw_height / 2
@@ -870,12 +892,14 @@ class SvgWriter:
projected_points = [self.project_point_onto_camera(matrix_world @ v.co) for v in obj.data.vertices]
element = tool.Ifc.get_entity(obj)
- svg_id = str(ifcopenshell.util.element.get_predefined_type(element))
-
- # EPset_AnnotationSurveyArea is not standard! See bSI-4.3 proposal #660.
- point_type = ifcopenshell.util.element.get_pset(element, "EPset_AnnotationSurveyArea", "PointType")
- if point_type:
- svg_id += f"-{point_type}"
+ svg_id = ifcopenshell.util.element.get_pset(element, "EPset_Annotation", "Symbol")
+ if not svg_id:
+ # EPset_AnnotationSurveyArea is not standard! See bSI-4.3 proposal #660.
+ svg_id = ifcopenshell.util.element.get_pset(element, "EPset_AnnotationSurveyArea", "PointType")
+ if not svg_id:
+ svg_id = str(ifcopenshell.util.element.get_predefined_type(element))
+ if not svg_id:
+ return
for symbol_position in projected_points:
symbol_position = Vector(((x_offset + symbol_position.x), (y_offset - symbol_position.y)))
diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py
index 36b99fb044..8c2751c4f6 100644
--- a/src/blenderbim/blenderbim/tool/drawing.py
+++ b/src/blenderbim/blenderbim/tool/drawing.py
@@ -71,6 +71,8 @@ class Drawing(blenderbim.core.tool.Drawing):
obj = annotation.Annotator.add_plane_to_annotation(obj)
elif object_type == "REVISION_CLOUD":
obj = annotation.Annotator.add_plane_to_annotation(obj, remove_face=True)
+ elif object_type == "MULTI_SYMBOL":
+ obj = annotation.Annotator.add_vertex_to_annotation(obj)
elif object_type == "TEXT_LEADER":
co1, _, co2, _ = annotation.Annotator.get_placeholder_coords()
obj = annotation.Annotator.add_line_to_annotation(obj, co2, co1)
diff --git a/src/blenderbim/scripts/generate_demo_library.py b/src/blenderbim/scripts/generate_demo_library.py
index e0017925db..7f5775a39f 100644
--- a/src/blenderbim/scripts/generate_demo_library.py
+++ b/src/blenderbim/scripts/generate_demo_library.py
@@ -146,6 +146,9 @@ class LibraryGenerator:
self.create_type("IfcDoorType", "DT01", {"model_body": "Door", "plan_body": "Door-Plan"})
self.create_type("IfcFurnitureType", "BUN01", {"model_body": "Bunny", "plan_body": "Bunny-Plan"})
+ self.create_symbol_type("SETOUT-POINT", "setout-point")
+ self.create_symbol_type("CONTROL-POINT", "control-point")
+ self.create_symbol_type("TRAVERSE-POINT", "traverse-point")
self.create_line_type("DASHED", "dashed")
self.create_line_type("FINE", "fine")
self.create_line_type("THIN", "thin")
@@ -161,6 +164,12 @@ class LibraryGenerator:
self.file.write("IFC4 Demo Library.ifc")
+ def create_symbol_type(self, name, symbol):
+ element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcTypeProduct", name=name)
+ element.ApplicableOccurrence = "IfcAnnotation/SYMBOL"
+ pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Annotation")
+ ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Symbol": symbol})
+
def create_line_type(self, name, classes):
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcTypeProduct", name=name)
element.ApplicableOccurrence = "IfcAnnotation/LINEWORK"
diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py
index 8b458ef777..31bf7f1f98 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py
@@ -823,6 +823,8 @@ class Usecase:
def create_annotation2d_representation(self):
if isinstance(self.settings["geometry"], bpy.types.Mesh) and len(self.settings["geometry"].polygons):
items = self.create_annotation_fill_areas(is_2d=True)
+ elif isinstance(self.settings["geometry"], bpy.types.Mesh) and not len(self.settings["geometry"].edges):
+ return self.create_point_cloud_representation(is_2d=True)
else:
items = [self.file.createIfcGeometricCurveSet(self.create_curves(is_2d=True))]
return self.file.createIfcShapeRepresentation(