§
    aÛÀjÕ9  ã                  óÂ   — d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZmZmZ dd	lmZ  ej        e¦  «        Z G d
„ de¦  «        ZdS )a(  
Inverse-BIM Constraint Solver Engine.
Extracts CAD vector geometry (DWG/DXF/vector PDF), grid axes, dimensions,
cross-sections, and entity tags into a parametric constraint model.
Computes deterministic solid volumes (concrete m3, formwork m2, rebar kg)
without probabilistic AI hallucinations.
é    )ÚannotationsN)ÚROUND_HALF_UPÚDecimal)ÚPath)ÚAny)ÚVietnameseCadFontTranscoder)ÚCulvertCrossSectionÚCulvertSegmentModelÚInverseBimParametricModelÚSolidTakeoffQuantities)ÚInverseBimSolverPortc                  ó"   — e Zd ZdZdd„Zdd„ZdS )ÚInverseBimConstraintSolverzPDeterministic CAD Vector & Constraint Solving Engine for Civil/Hydraulic Assets.Ú
cad_sourceú
str | PathÚkwargsr   Úreturnr   c                ó´  ‡'‡(— t          |¦  «        }|j                             ¦   «         }t          d¦  «        }t          d¦  «        }t          d¦  «        }t          d¦  «        }t          d¦  «        }	t          d¦  «        }
t          d¦  «        }t          d¦  «        }t          d¦  «        }t          d¦  «        }t          d¦  «        }d}t          d	¦  «        Š(d
}|dk    �r|                     ¦   «         �rì	 ddl}|                     t          |¦  «        ¦  «        }|                     ¦   «         }g }|D ]y}| 	                    ¦   «         dk    r_t          |j        d¦  «        rJ|j        j        �>t          |j        j        ¦  «        }d|cxk    rdk    rn Œd|                     |¦  «         Œzt          d„ |D ¦   «         ¦  «        rt          d¦  «        }t          d„ |D ¦   «         ¦  «        rt          d¦  «        }t          d¦  «        }	t          d„ |D ¦   «         ¦  «        rt          d¦  «        }g }|D ]x}| 	                    ¦   «         dv r`t          |j        d¦  «        r|j        j        nd}|r;t#          j        |                     ¦   «         ¦  «        }|                     |¦  «         Œyd                     |¦  «                             ¦   «         }t+          j        d|¦  «        }|r¼t          |                     d¦  «        ¦  «        t          d¦  «        z  }t          |                     d¦  «        ¦  «        t          d¦  «        z  }t          d¦  «        |cxk    rt          d¦  «        k    rn n|}t          d¦  «        |cxk    rt          d¦  «        k    rn n|}�nC# t0          $ r&}t2                               d|¦  «         Y d}~�nd}~ww xY w|d k    �r	|                     ¦   «         rõ	 ddl}d} |                     t          |¦  «        ¦  «        5 }|D ]0}!|!                     ¦   «         }"| dt#          j        |"¦  «        z   z  } Œ1	 ddd¦  «         n# 1 swxY w Y   t+          j        d!| ¦  «        }#|#rt          d¦  «        }t          d¦  «        }d"|                      ¦   «         v rd#}n2# t0          $ r%}$t2                               d$|$¦  «         Y d}$~$nd}$~$ww xY wd%|v rt=          |d%         ¦  «        }d&|v r"t          t          |d&         ¦  «        ¦  «        Š(d'|v rt          |d'         ¦  «        }‰(t          t          |¦  «        ¦  «        z  }%t?          |||||	|
|||||¬(¦  «        Š'ˆ'ˆ(fd)„tA          |¦  «        D ¦   «         }&tC          d*||%||&d+dt          d,¦  «        t          d-¦  «        ¬.¦	  «	        S )/zUExtract geometric parameters from CAD source (DXF, DWG, PDF, or specification files).z2.5000z0.3000z0.2500z3.4000z0.1000z25.0000z0.1500é   z43.0000u)   Há»‡ thá»‘ng cá»‘ng há»™p kÃªnh Báº¿n Kemz.dxfr   NÚ	DIMENSIONÚactual_measurementç      $@g     jø@c              3  óB   K  — | ]}t          |d z
  ¦  «        dk     V — ŒdS )g     Àr@ç      @N©Úabs©Ú.0Úds     úSC:\Projects\DSCons\app\modules\takeoff\application\inverse_bim_constraint_solver.pyú	<genexpr>zLInverseBimConstraintSolver.extract_parametric_constraints.<locals>.<genexpr>Q   ó1   è è € Ð@Ð@°•s˜1˜u™9‘~”~¨Ò+Ð@Ð@Ð@Ð@Ð@Ð@ó    c              3  óB   K  — | ]}t          |d z
  ¦  «        dk     V — ŒdS )g     @o@r   Nr   r   s     r    r!   zLInverseBimConstraintSolver.extract_parametric_constraints.<locals>.<genexpr>S   r"   r#   c              3  óB   K  — | ]}t          |d z
  ¦  «        dk     V — ŒdS )g     Àb@r   Nr   r   s     r    r!   zLInverseBimConstraintSolver.extract_parametric_constraints.<locals>.<genexpr>V   r"   r#   )ÚTEXTÚMTEXTÚtextÚ ú z(\d{3,4})\s*[xX*]\s*(\d{3,4})é   iè  é   z1.0z6.0z'[InverseBimSolver] DXF parse notice: %sz.pdfz2500\s*[xX]\s*2500Úu200x80u+   Cá»‘ng há»™p BTCT 2500x2500 kÃªnh Báº¿n Kemz'[InverseBimSolver] PDF parse notice: %sÚnum_segmentsÚsegment_length_mÚstructure_name)Úclear_span_mÚclear_height_mÚwall_thickness_mÚbottom_slab_thickness_mÚtop_slab_thickness_mÚbottom_slab_width_mÚlean_concrete_thickness_mÚlean_concrete_width_mÚbamboo_pile_density_per_m2Úbamboo_pile_length_mÚhaunch_size_mc                óH   •— g | ]}t          |d z   d|d z   › �‰‰¬¦  «        ‘ŒS )r+   u   PhÃ¢n Ä‘oáº¡n )Ú
segment_idÚsegment_nameÚlength_mÚcross_section)r
   )r   Úir@   Ú
seg_lengths     €€r    ú
<listcomp>zMInverseBimConstraintSolver.extract_parametric_constraints.<locals>.<listcomp>š   sV   ø€ ð 
ð 
ð 
ð õ  Ø˜q™5Ø5¨a°!©eÐ5Ð5Ø#Ø+ð	ñ ô ð
ð 
ð 
r#   Úbox_culvertTz12.0000z96.0800)	Ústructure_typer0   Útotal_length_mr.   ÚsegmentsÚhas_inlet_outlet_wingsÚinlet_outlet_wings_countÚcofferdam_larsen_pile_length_mÚcofferdam_sheet_perimeter_m)"r   ÚsuffixÚlowerr   ÚexistsÚezdxfÚreadfileÚstrÚ
modelspaceÚdxftypeÚhasattrÚdxfr   ÚfloatÚappendÚanyr(   r   Úauto_transcode_cad_textÚstripÚjoinÚreÚsearchÚgroupÚ	ExceptionÚloggerÚwarningÚfitzÚopenÚget_textÚintr	   Úranger   ))Úselfr   r   Úcad_pathÚextÚspanÚheightÚwall_tÚbot_tÚtop_tÚbot_wÚlean_tÚlean_wÚ	pile_densÚpile_lenÚhaunchr.   r0   rO   ÚdocÚmspÚ
dimensionsÚeÚvalÚ	all_textsÚraw_tÚclean_tÚcombined_textsÚm_spanÚs_valÚh_valrb   Úpdf_textÚpageÚtxtÚm_dimÚe_pdfÚtotal_lengthrG   r@   rB   s)                                          @@r    Úextract_parametric_constraintsz9InverseBimConstraintSolver.extract_parametric_constraints#   sš  øø€ õ ˜
Ñ#Ô#ˆØŒo×#Ò#Ñ%Ô%ˆõ �xÑ Ô ˆÝ˜Ñ"Ô"ˆÝ˜Ñ"Ô"ˆÝ˜Ñ!Ô!ˆÝ˜Ñ!Ô!ˆÝ˜Ñ!Ô!ˆÝ˜Ñ"Ô"ˆÝ˜Ñ"Ô"ˆÝ˜IÑ&Ô&ˆ	Ý˜8Ñ$Ô$ˆÝ˜Ñ"Ô"ˆàˆÝ˜YÑ'Ô'ˆ
ØDˆð �&Š=‰=˜XŸ_š_Ñ.Ô.‰=ð-MØ���Ø—n’n¥S¨¡]¤]Ñ3Ô3�Ø—n’nÑ&Ô&�ð +-�
Øð 3ð 3�AàŸ	š	™œ {Ò2Ð2Ý# A¤EÐ+?Ñ@Ô@ð 3àœEÔ4Ð@å# A¤EÔ$<Ñ=Ô=˜Ø 3Ð2Ð2Ò2Ð2¨(Ò2Ð2Ð2Ð2Ð2Ø&×-Ò-¨cÑ2Ô2Ð2øõ Ð@Ð@°ZÐ@Ñ@Ô@Ñ@Ô@ð /Ý$ XÑ.Ô.�FÝÐ@Ð@°ZÐ@Ñ@Ô@Ñ@Ô@ð .Ý# HÑ-Ô-�EÝ# HÑ-Ô-�EÝÐ@Ð@°ZÐ@Ñ@Ô@Ñ@Ô@ð /Ý$ XÑ.Ô.�Fð �	Øð 6ð 6�AØ—y’y‘{”{Ð&7Ð7Ð7Ý.5°a´e¸VÑ.DÔ.DÐ L ¤¤
 
È"˜Ø ð 6Ý&AÔ&YÐZ_×ZeÒZeÑZgÔZgÑ&hÔ&h˜GØ%×,Ò,¨WÑ5Ô5Ð5øà!$§¢¨)Ñ!4Ô!4×!:Ò!:Ñ!<Ô!<�ÝœÐ#CÀ^ÑTÔT�Øð 'Ý# F§L¢L°¡O¤OÑ4Ô4µw¸t±}´}ÑD�EÝ# F§L¢L°¡O¤OÑ4Ô4µw¸t±}´}ÑD�EÝ˜u‘~”~¨Ð@Ð@Ò@Ð@µ'¸%±.´.Ò@Ð@Ð@Ð@Ð@Ø$˜Ý˜u‘~”~¨Ð@Ð@Ò@Ð@µ'¸%±.´.Ò@Ð@Ð@Ð@Ð@Ø!&˜ùøÝð Mð Mð MÝ—’ÐHÈ!ÑLÔLÐLÐLÐLÐLÐLÑLøøøøðMøøøð �FŠ]‰]˜xŸšÑ0Ô0ˆ]ðQØ���Ø�Ø—Y’Y�s 8™}œ}Ñ-Ô-ð c°Ø #ð cð c˜Ø"Ÿmšm™oœo˜Ø  CÕ*EÔ*]Ð^aÑ*bÔ*bÑ$bÑb˜˜ðcðcð cð cñ cô cð cð cð cð cð cð cøøøð cð cð cð cõ œ	Ð"7¸ÑBÔB�Øð /Ý" 8Ñ,Ô,�DÝ$ XÑ.Ô.�FØ §¢Ñ 0Ô 0Ð0Ð0Ø%R�NøøÝð Qð Qð QÝ—’ÐHÈ%ÑPÔPÐPÐPÐPÐPÐPÐPøøøøðQøøøð ˜VÐ#Ð#Ý˜v nÔ5Ñ6Ô6ˆLØ Ð'Ð'Ý ¥ VÐ,>Ô%?Ñ!@Ô!@ÑAÔAˆJØ˜vÐ%Ð%Ý  Ð(8Ô!9Ñ:Ô:ˆNà!¥G­C°Ñ,=Ô,=Ñ$>Ô$>Ñ>ˆå+ØØ!Ø#Ø$)Ø!&Ø %Ø&,Ø"(Ø'0Ø!)Ø ð
ñ 
ô 
ˆð
ð 
ð 
ð 
ð 
õ ˜<Ñ(Ô(ð
ñ 
ô 
ˆõ )Ø(Ø)Ø'Ø%ØØ#'Ø%&Ý+2°9Ñ+=Ô+=Ý(/°	Ñ(:Ô(:ð

ñ 

ô 

ð 
	
sV   Ä J6N8 Î8
O(ÏO#Ï#O(Ð(S	 Ð/4Q0Ñ$S	 Ñ0Q4Ñ4S	 Ñ7Q4Ñ8AS	 Ó	
S8ÓS3Ó3S8Úmodelr   c           	     ó€  — |j         }t          t          |j        ¦  «        ¦  «        }|j        r|j        d         j        nt          ¦   «         }||j        z  |j        z   	                    t          d¦  «        t          ¬¦  «        }|}t          ||j        z  |j        z                       ¦   «         ¦  «        }t          t          |¦  «        ¦  «        |j        z  t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }t          d¦  «        |z  t          d¦  «        |j        z  |z  z   |j        z  t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }	||j        z  |j        z   	                    t          d¦  «        t          ¬¦  «        }
t          d¦  «        |z  t          d¦  «        |j        z  |z  z   |j        z  t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }|dk    r||z  nt          d¦  «        }|t          d¦  «        t          d¦  «        z  z   	                    t          d¦  «        t          ¬¦  «        }|||j        z   z  t          d¦  «        z  |j        z  t          d¦  «        z  t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }||j        z  |j        z   	                    t          d¦  «        t          ¬¦  «        }||j        z  |||j        z   z  t          d¦  «        z  |j        z  z   t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }|t          d	¦  «        t          d¦  «        z  z   	                    t          d¦  «        t          ¬¦  «        }|j        r!t          t          |j        ¦  «        ¦  «        nt          d
¦  «        }t          d¦  «        t          d¦  «        z  |z   	                    t          d¦  «        t          ¬¦  «        }t          d¦  «        t          d¦  «        z  |z   	                    t          d¦  «        t          ¬¦  «        }t          d¦  «        t          d¦  «        z  |z   	                    t          d¦  «        t          ¬¦  «        }t          d¦  «        t          d¦  «        z  |z   	                    t          d¦  «        t          ¬¦  «        }t          d¦  «        t          d¦  «        z  |z   	                    t          d¦  «        t          ¬¦  «        }t          t          t-          j        t1          |¦  «        dz  ¦  «        ¦  «        ¦  «        }|t          d¦  «        z  t          d¦  «        z  |t          d¦  «        z  t          d¦  «        z  z   t          d¦  «        t          d¦  «        z  z   |t          d¦  «        z  t          d¦  «        z  z   t          d¦  «        z  }||z   	                    t          d¦  «        t          ¬¦  «        }|t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }|t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }| 	                    t          d¦  «        t          ¬¦  «        }t          d¦  «        t          d¦  «        z  t          d¦  «        z   t          d¦  «        z  t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }|t          d¦  «        z  }t          d¦  «        |z  t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        } t          d¦  «        |z  t          d¦  «        z  t          d¦  «        z   	                    t          d¦  «        t          ¬¦  «        }!| t          d¦  «        z  |!z    	                    t          d¦  «        t          ¬¦  «        }"t          d¦  «        |z   	                    t          d¦  «        t          ¬¦  «        }#t          d¦  «        |z  t          d¦  «        z  t          d¦  «        z
   	                    t          d¦  «        t          ¬¦  «        }$|$t          d¦  «        z  t          d ¦  «        z   	                    t          d¦  «        t          ¬¦  «        }%t3          d=i d!|“d"|
“d#|“d$|“d%|	“d&|“d'|“d(|“d)|“d*|“d+|“d,|“d-|“d.|“d/|“d0|“d1|“d2| “d3|!“d4|"“d5|#“d6|$“d7|%“d8|“d9|“d:|“d;|“d<|“ŽS )>z_Compute exact solid volumes (concrete m3, formwork m2, foundation, earthwork) from constraints.r   z0.0001)Úroundingz100.0z2.0z0.0000z280.1925z215.0000z207.5500z0.0z15.7450z2.5200z12.8340z2.5938z0.3065r   z8.0z5.6z60.0000z15.0000z5.0z20.0z3.0z	1647.0000z0.70z	1628.4270z0.30z0.0004z16.4140z	2224.5300z8.1421z1.10Úlean_concrete_volume_m3Úbottom_slab_concrete_volume_m3Úbamboo_piles_total_100mÚbamboo_piles_countÚlean_concrete_formwork_100m2Úbottom_slab_formwork_100m2Úsand_cushion_volume_m3Úwall_concrete_volume_m3Úwall_formwork_100m2Útop_slab_concrete_volume_m3Útop_slab_formwork_100m2Úwaterstop_m2Úwing_bamboo_piles_100mÚwing_lean_concrete_m3Úwing_bottom_slab_concrete_m3Úwing_wall_concrete_m3Úwing_formwork_100m2Úslush_mud_suction_m3Úfoundation_excavation_100m3Úmass_excavation_100m3Úsoil_haul_100m3Úsoil_backfill_100m3Úmountain_soil_material_m3Úlarsen_pile_driving_100mÚlarsen_pile_rental_mÚwater_pumping_shiftsÚground_mat_segmentsÚgeotextile_100m2© )rF   r   rQ   r.   rG   r@   r	   r8   r7   Úquantizer   re   r6   r9   Úto_integral_valuer:   r4   r5   r2   r1   rH   rI   ÚmathÚceilrV   r   )&rg   rˆ   ÚL_totalÚN_segÚcsÚlean_volÚsand_cushion_volÚpiles_countÚpiles_total_100mÚlean_fwÚbot_volÚbot_fwÚL_segÚwall_volÚwall_fwÚtop_volÚtop_fwÚ	waterstopÚN_wingsÚwing_piles_100mÚwing_lean_m3Úwing_bot_m3Úwing_wall_m3Úwing_fw_100m2Ústrut_pointsÚlarsen_per_segÚlarsen_driving_100mÚlarsen_rental_mÚwater_pumpingÚground_matsÚ
geotextileÚ
len_factorÚslush_mud_m3Úexcav_08_100m3Úexcav_125_100m3Ú
haul_100m3Úbackfill_100m3Úmountain_soil_m3s&                                         r    Úcompute_deterministic_solidsz7InverseBimConstraintSolver.compute_deterministic_solids°   sØ	  € ð
 Ô&ˆÝ�˜EÔ.Ñ/Ô/Ñ0Ô0ˆØ05´ÐYˆUŒ^˜AÔÔ,Ð,ÕDWÑDYÔDYˆð ˜bÔ6Ñ6¸Ô9UÑU×_Ò_Ý�HÑÔ­ð `ñ 
ô 
ˆð $ÐåØ�rÔ-Ñ-°Ô0MÑM×`Ò`ÑbÔbñ
ô 
ˆõ •S˜Ñ%Ô%Ñ&Ô&¨Ô)@Ñ@ÅGÈGÑDTÔDTÑTß
Š(•7˜8Ñ$Ô$­}ˆ(Ñ
=Ô
=ð 	õ �U‰^Œ^˜gÑ%­°©¬¸Ô9QÑ(QÐTYÑ(YÑYØÔ*ñ+å�gÑÔñ÷ Š(•7˜8Ñ$Ô$­}ˆ(Ñ
=Ô
=ð	 	ð ˜RÔ3Ñ3°bÔ6PÑP×ZÒZÝ�HÑÔ­ð [ñ 
ô 
ˆõ �U‰^Œ^˜gÑ%­°©¬¸Ô9OÑ(OÐRWÑ(WÑWØÔ(ñ)å�gÑÔñ÷ Š(•7˜8Ñ$Ô$­}ˆ(Ñ
=Ô
=ð	 	ð $)¨1¢9 9�˜%‘�µ'¸(Ñ2CÔ2CˆØ�w zÑ2Ô2µW¸ZÑ5HÔ5HÑHÑI×SÒSÝ�HÑÔ­ð Tñ 
ô 
ˆð �e˜bÔ5Ñ5Ñ6½À¹¼ÑGÈ"ÔJ[Ñ[Õ^eÐfkÑ^lÔ^lÑlÝ�gÑÔñç
Š(•7˜8Ñ$Ô$­}ˆ(Ñ
=Ô
=ð 	ð ˜Rœ_Ñ,¨rÔ/FÑF×PÒPÝ�HÑÔ­ð Qñ 
ô 
ˆð
 �r”Ñ&¨°%¸"Ô:PÑ2PÑ)QÕT[Ð\aÑTbÔTbÑ)bÐegÔe|Ñ)|Ñ|Ý�gÑÔñç
Š(•7˜8Ñ$Ô$­}ˆ(Ñ
=Ô
=ð 	ð ¥¨
Ñ 3Ô 3µg¸jÑ6IÔ6IÑ IÑJ×TÒTÝ�HÑÔ­ð Uñ 
ô 
ˆ	ð
 CHÔB^Ðr•'�#˜eÔ<Ñ=Ô=Ñ>Ô>Ð>ÕdkÐlqÑdrÔdrˆÝ# IÑ.Ô.µ¸±´Ñ?À7ÑJ×TÒTÝ�HÑÔ­ð Uñ 
ô 
ˆõ ! Ñ*Ô*­W°U©^¬^Ñ;¸wÑF×PÒPÝ�HÑÔ­ð Qñ 
ô 
ˆõ   	Ñ*Ô*­W°U©^¬^Ñ;¸wÑF×PÒPÝ�HÑÔ­ð Qñ 
ô 
ˆõ ! Ñ*Ô*­W°U©^¬^Ñ;¸wÑF×PÒPÝ�HÑÔ­ð Qñ 
ô 
ˆõ " (Ñ+Ô+­g°e©n¬nÑ<ÀÑG×QÒQÝ�HÑÔ­ð Rñ 
ô 
ˆõ �s¥4¤9­U°5©\¬\¸DÑ-@Ñ#AÔ#AÑBÔBÑCÔCˆà•G˜E‘N”NÑ"¥W¨U¡^¤^Ñ3Ø•g˜e‘n”nÑ$¥w¨u¡~¤~Ñ5ñ6å�e‰nŒn�w u™~œ~Ñ-ñ.ð �W U™^œ^Ñ+­g°e©n¬nÑ<ñ=õ �GÑÔñˆð  % ~Ñ5×?Ò?ÅÈÑ@QÔ@QÕ\iÐ?ÑjÔjÐð /µ¸Ñ1CÔ1CÑC×MÒMÍgÐV^ÑN_ÔN_ÕjwÐMÑxÔxˆØ¥¨Ñ!3Ô!3Ñ3×=Ò=½gÀhÑ>OÔ>OÕZgÐ=ÑhÔhˆØ—n’n¥W¨XÑ%6Ô%6Å�nÑOÔOˆÝ ™œ­°©¬Ñ7½7À6¹?¼?ÑJÍgÐV[ÉnÌnÑ\Õ_fÐgnÑ_oÔ_oÑo×yÒyÝ�HÑÔ­ð zñ 
ô 
ˆ
ð
 �w zÑ2Ô2Ñ2ˆ
Ý Ñ,Ô,¨zÑ9½GÀF¹O¼OÑK×UÒUÝ�HÑÔ­ð Vñ 
ô 
ˆõ " +Ñ.Ô.°Ñ;½gÀf¹o¼oÑMÕPWÐX_ÑP`ÔP`Ñ`×jÒjÝ�HÑÔ­ð kñ 
ô 
ˆð (­'°'Ñ*:Ô*:Ñ:¸^ÑK×UÒUÝ�HÑÔ­ð Vñ 
ô 
ˆõ ˜iÑ(Ô(¨:Ñ5×?Ò?ÅÈÑ@QÔ@QÕ\iÐ?ÑjÔjˆ
å�[Ñ!Ô! JÑ.µ'¸'Ñ2BÔ2BÑBÅWÈXÑEVÔEVÑVß
Š(•7˜8Ñ$Ô$­}ˆ(Ñ
=Ô
=ð 	ð +­W°WÑ-=Ô-=Ñ=ÅÈÁÄÑO×YÒYÝ�HÑÔ­ð Zñ 
ô 
Ðõ &ð 
ð 
ð 
Ø$, Hð
à+2¨7ð
ð %5Ð$4ð
ð  +˜{ð	
ð
 *1¨ð
ð (. vð
ð $4Ð#3ð
ð %- Hð
ð !( ð
ð )0¨ð
ð %+ Fð
ð #˜ð
ð $3 ?ð
ð #/ ,ð
ð *5¨ð
ð  #/ ,ð!
ð" !. ð#
ð$ ". ð%
ð& )7¨ð'
ð( #2 /ð)
ð* '˜Jð+
ð, !/ ð-
ð. '7Ð&6ð/
ð0 &9Ð%8ð1
ð2 "1 ð3
ð4 "/ ð5
ð6 !, ð7
ð8 (˜Zð9
ð 	
r#   N)r   r   r   r   r   r   )rˆ   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r‡   rÐ   r§   r#   r    r   r       sM   € € € € € ØZÐZðK
ð K
ð K
ð K
ðZZ
ð Z
ð Z
ð Z
ð Z
ð Z
r#   r   )rÔ   Ú
__future__r   Úloggingrª   r\   Údecimalr   r   Úpathlibr   Útypingr   Ú>app.modules.takeoff.application.vietnamese_cad_font_transcoderr   Ú-app.modules.takeoff.domain.inverse_bim_modelsr	   r
   r   r   Ú1app.modules.takeoff.domain.ports.inverse_bim_portr   Ú	getLoggerrÑ   r`   r   r§   r#   r    ú<module>rÞ      s:  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð SÐ RÐ RÐ RÐ RÐ Rà	ˆÔ	˜8Ñ	$Ô	$€ðj
ð j
ð j
ð j
ð j
Ð!5ñ j
ô j
ð j
ð j
ð j
r#   