§
    ½¶Àj:º  ã                  ó¬   — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ  ej        e¦  «        Z G d	„ d
¦  «        ZdS )uc  
CAD Geometric Takeoff Engine (Ä�á»™ng cÆ¡ bÃ³c tÃ¡ch hÃ¬nh há»�c thá»±c thá»ƒ CAD Vector).
TrÃ­ch xuáº¥t vÃ  tÃ­nh toÃ¡n trá»±c tiáº¿p tá»« cÃ¡c thá»±c thá»ƒ hÃ¬nh há»�c AutoCAD (LWPOLYLINE, LINE, DIMENSION, INSERT, HATCH, TEXT)
khÃ´ng phá»¥ thuá»™c vÃ o há»“ sÆ¡ má»�i tháº§u máº«u.
TuÃ¢n thá»§ Luáº­t XÃ¢y dá»±ng 2025 & Ä�á»‹nh má»©c XÃ¢y dá»±ng 2026.
é    )ÚannotationsN)ÚDecimal)ÚPath)ÚAny)ÚCadConverterService)ÚVietnameseCadFontTranscoderc                  óJ   — e Zd ZdZedd„¦   «         Ze	 	 	 ddd„¦   «         ZdS )ÚCadGeometricEnginez1Enterprise CAD Vector & Geometric Takeoff Engine.Údxf_pathÚstrÚreturnúdict[str, Any]c                óš	  — ddl }|                     |¦  «        }|                     ¦   «         }d„ |j        D ¦   «         }d„ |j        D ¦   «         }i }g }g }	i }
g }d}|D �]}|                     ¦   «         }|                     |d¦  «        dz   ||<   |dv rwt          |j        d¦  «        r|j        j	        nd	}|rQ| 
                    ¦   «         r=t          j        | 
                    ¦   «         ¦  «        }|r|                     |¦  «         Œ®|d
k    rat          |j        d¦  «        rJ|j        j        �>t          |j        j        ¦  «        }d|cxk    rdk    rn Œþ|	                     |¦  «         �Œ|dk    r>|j        j        }t          j        |¦  «        }|
                     |d¦  «        dz   |
|<   �ŒY|dv �r%	 t#          |dd¦  «        �rÿt          |d¦  «        r!t%          |                     ¦   «         ¦  «        n t%          |                     ¦   «         ¦  «        }t+          |¦  «        dk    �r™d}t+          |¦  «        }t-          |¦  «        D �]5}|dz   |z  }t/          ||         t$          t0          f¦  «        r||         d         n||         j        j        j        }t/          ||         t$          t0          f¦  «        r||         d         n||         j        j        j        }t/          ||         t$          t0          f¦  «        r||         d         n||         j        j        j        }t/          ||         t$          t0          f¦  «        r||         d         n||         j        j        j        }|||z  ||z  z
  z  }�Œ7t9          |¦  «        dz  }|dk    r*|dz  }d|cxk    rdk    rn n|                     |¦  «         �Œr# t:          $ r Y �Œw xY w|dk    rŠ	 |j        j        }|j        j        }tA          j!        |d         |d         z
  dz  |d         |d         z
  dz  z   |d         |d         z
  dz  z   ¦  «        } | dk    r|| dz  z  }�Œ# t:          $ r Y �Œw xY w�Œ|t+          |¦  «        |t+          |¦  «        ||
t+          |¦  «        |dd…         |t+          |	¦  «        |	|tE          |d¦  «        dœS )ziScan and summarize all CAD entities, layers, dimensions, and blocks via high-speed single-pass traversal.r   Nc                ó&   — g | ]}|j         j        ‘ŒS © )ÚdxfÚname)Ú.0Úls     úJc:\Projects\DSCons\app\modules\takeoff\application\cad_geometric_engine.pyú
<listcomp>zCCadGeometricEngine.extract_cad_entities_summary.<locals>.<listcomp>#   s   € Ð1Ð1Ð1 �!”%”*Ð1Ð1Ð1ó    c                óP   — g | ]#}|j                              d ¦  «        °|j         ‘Œ$S )Ú*)r   Ú
startswith)r   Úbs     r   r   zCCadGeometricEngine.extract_cad_entities_summary.<locals>.<listcomp>$   s/   € ÐKÐKÐK˜Q°A´F×4EÒ4EÀcÑ4JÔ4JÐK�!”&ÐKÐKÐKr   ç        é   )ÚTEXTÚMTEXTÚtextÚ Ú	DIMENSIONÚactual_measurementg      $@g     jø@ÚINSERT)Ú
LWPOLYLINEÚPOLYLINEÚ	is_closedFÚverticesé   ç       @g    €„.Aç      à?g     ˆÃ@ÚLINEé   ç      ð?ç     @�@é(   )Úentity_countsÚlayers_countÚlayersÚblocks_countÚblocksÚblock_insertsÚtexts_countÚsample_textsÚ	all_textsÚdimensions_countÚ
dimensionsÚpolyline_areasÚtotal_line_length_m)#ÚezdxfÚreadfileÚ
modelspacer4   r6   ÚdxftypeÚgetÚhasattrr   r!   Ústripr   Úauto_transcode_cad_textÚappendr$   Úfloatr   ÚgetattrÚlistr)   Ú
get_pointsÚlenÚrangeÚ
isinstanceÚtupleÚlocationÚxÚyÚabsÚ	ExceptionÚstartÚendÚmathÚsqrtÚround)!Úclsr   r?   ÚdocÚmspr4   r6   r2   Ú	raw_textsr<   r7   r=   r>   ÚerB   ÚvalÚcleanÚdim_valÚbnameÚclean_bnameÚptsÚareaÚnÚiÚjÚxiÚyiÚxjÚyjÚarea_m2rU   rV   Údists!                                    r   Úextract_cad_entities_summaryz/CadGeometricEngine.extract_cad_entities_summary   s=  € ð 	ˆˆˆà�nŠn˜XÑ&Ô&ˆØ�nŠnÑÔˆà1Ð1 c¤jÐ1Ñ1Ô1ˆØKÐK #¤*ÐKÑKÔKˆà(*ˆØ!ˆ	Ø"$ˆ
Ø(*ˆØ&(ˆØ!Ðð ð M	ñ M	ˆAØ—i’i‘k”kˆGØ%2×%6Ò%6°wÀÑ%BÔ%BÀQÑ%FˆM˜'Ñ"àÐ+Ð+Ð+Ý$+¨A¬E°6Ñ$:Ô$:ÐB�a”e”j�jÀ�Øð 0˜3Ÿ9š9™;œ;ð 0Ý7ÔOØŸ	š	™œñô �Eð ð 0Ø!×(Ò(¨Ñ/Ô/Ð/øØ˜KÒ'Ð'å˜AœEÐ#7Ñ8Ô8ð3àœÔ0Ð<å# A¤EÔ$<Ñ=Ô=�GØ˜wÐ2Ð2Ò2Ð2¨(Ò2Ð2Ð2Ð2Ð2Ø"×)Ò)¨'Ñ2Ô2Ð2ùØ˜HÒ$Ð$Øœœ
�Ý9ÔQÐRWÑXÔX�Ø-:×->Ò->¸{ÈAÑ-NÔ-NÐQRÑ-R�˜kÑ*Ñ*ØÐ6Ð6Ñ6ð'Ý˜q +¨uÑ5Ô5ñ $Cõ  ' q¨*Ñ5Ô5ð6�D §¢¡¤Ñ.Ô.Ð.å!% a§l¢l¡n¤nÑ!5Ô!5ð õ
 ˜s™8œ8 qš=™=Ø#&˜DÝ # C¡¤˜AÝ%*¨1¡X¤Xð >ñ > Ø%&¨¡U¨a¡K õ (2°#°a´&½4Å¸-Ñ'HÔ'Hð%? C¨¤F¨1¤I Ià),¨Q¬¬Ô)<Ô)>ð !#õ (2°#°a´&½4Å¸-Ñ'HÔ'Hð%? C¨¤F¨1¤I Ià),¨Q¬¬Ô)<Ô)>ð !#õ (2°#°a´&½4Å¸-Ñ'HÔ'Hð%? C¨¤F¨1¤I Ià),¨Q¬¬Ô)<Ô)>ð !#õ (2°#°a´&½4Å¸-Ñ'HÔ'Hð%? C¨¤F¨1¤I Ià),¨Q¬¬Ô)<Ô)>ð !#ð
 !%¨¨b©°R¸"±WÑ(=Ñ = ¡Ý#& t¡9¤9¨s¡?˜DØ# iÒ/Ð/Ø*.°Ñ*: Ø#&¨'Ð#<Ð#<Ò#<Ð#<°WÒ#<Ð#<Ð#<Ð#<Ð#<Ø$2×$9Ò$9¸'Ñ$BÔ$BÐ$BùøÝ ð ð ð Ø‘Dðøøøà˜FÒ"Ð"ðØœEœK�EØœ%œ)�CÝœ9Ø˜Qœ %¨¤(Ñ*¨qÑ0Ø˜qœ6 E¨!¤HÑ,°Ñ2ñ3à˜qœ6 E¨!¤HÑ,°Ñ2ñ3ñô �Dð
 ˜c’z�zØ+¨t°f©}Ñ<Ð+ùøÝ ð ð ð Ø‘Dðøøøñ #ð +Ý ™KœKØÝ ™KœKØØ*Ý˜y™>œ>Ø% c r cœNØ"Ý # J¡¤Ø$Ø,Ý#(Ð)<¸aÑ#@Ô#@ð
ð 
ð 	
s&   Æ=HOÏ
OÏOÏ(A6Q Ñ 
Q.Ñ-Q.r"   NÚdwg_or_dxf_pathÚfilenameÚdrawing_hintÚ
erp_clientr   c           "     ój   ‡Q‡R‡S— t          |¦  «        }t          j                             |¦  «        d                              ¦   «         }|dk    rHt          j        |¦  «        }|rt          j                             |¦  «        st          d|› �¦  «        ‚n|}|  	                    |¦  «        }| 
                    dg ¦  «        }|› d|› dd                     |¦  «        › �                     ¦   «         ŠSt          ˆSfd„dD ¦   «         ¦  «        }	t          t          j        d‰S¦  «        ¦  «        }
|	�r~|
�r{t!          d	¦  «        t!          d
¦  «        g}|D �]Y}|                     ¦   «         �rA	 ddl}t%          |dd¬¦  «        5 }|                     |¦  «        }ddd¦  «         n# 1 swxY w Y   |rÆt(                               dt-          |¦  «        |¦  «         t/          d„ |D ¦   «         ¦  «        }|                     d¦  «        s|                     d¦  «        r|nd|› �d|› �ddddddt-          |¦  «        › d�dt-          |¦  «        › dt3          |¦  «        d›d�t5          |¦  «        d ||d!œc S �Œ&# t6          $ r&}t(                               d"|¦  «         Y d}~�ŒQd}~ww xY w�Œ[t          t          j        d#‰S¦  «        ¦  «        }t          t          j        d$‰S¦  «        ¦  «        o| }|�r´t!          d%¦  «        t!          d&¦  «        t!          d'¦  «        t!          d(¦  «        t!          d)¦  «        g}|D �]h}|                     ¦   «         �rP	 ddl}t%          |dd¬¦  «        5 }|                     |¦  «        }ddd¦  «         n# 1 swxY w Y   |rÕt(                               d*t-          |¦  «        |¦  «         t/          d+„ |D ¦   «         ¦  «        }|                     d¦  «        s|                     d¦  «        r|nd|› �d,d-d.d/dd0d1t-          |¦  «        › d2�d3t-          |¦  «        › d4t3          |¦  «        d›d5�d6t-          |¦  «        › d7�t5          |¦  «        d ||d8œc S �Œ5# t6          $ r&}t(                               d9|¦  «         Y d}~�Œ`d}~ww xY w�Œj| 
                    d:g ¦  «        }| 
                    d;g ¦  «        }| 
                    d<i ¦  «        }d=„ |D ¦   «         }|r,t;          |¦  «        }t=          d>„ |D ¦   «         pd?g¦  «        }nd@}d?}||z  }|rdA„ |D ¦   «         } | rt;          | ¦  «        }dB}!dC}"|                     ¦   «         D ]0\  ŠR}#t          ˆRfdD„dED ¦   «         ¦  «        rt;          |"|#¦  «        }"Œ1d}$d}%d}&|                     ¦   «         D ]{\  ŠR}#‰R                     ¦   «         ŠQt          ˆQfdF„dGD ¦   «         ¦  «        r|$|#z  }$Œ:t          ˆQfdH„dID ¦   «         ¦  «        r|%|#z  }%Œ[t          ˆQfdJ„dKD ¦   «         ¦  «        r|&|#z  }&Œ||$dk    rt;          dLt=          |$dM¦  «        ¦  «        ndN}$|%dk    rt;          dNt=          |%dO¦  «        ¦  «        ndP}%|&dk    rt;          dLt=          |&dC¦  «        ¦  «        ndN}&|	�r¦tA          |dQz  dL¦  «        }'tA          |dRz  dL¦  «        }(tA          |dSz  dL¦  «        })tA          |dTz  dL¦  «        }*tA          |dUz  dL¦  «        }+tA          |dVz  dL¦  «        },tA          |dQz  dWz  dL¦  «        }-tA          tC          j"        |¦  «        dNz  dL¦  «        }.dXdYdZd[tA          |d\z  dL¦  «        d]d^d_|d`›datA          |d\z  dL¦  «        › db�dcœdddedfdg|'dhdidj|d`›dk|'› dl�dcœdmdndodg|(dpdqdr|d`›ds|(› dl�dcœdtdudvdg|+dwdxdy|d`›dz|+› dl�dcœd{d|d}dgtA          |$d~z  |%d~z  z   dL¦  «        dd€d�|$› d‚|%› dƒtA          |$d~z  |%d~z  z   dL¦  «        › dl�dcœd„d…d†dg|)d‡dˆd‰|d`›dŠ|)› dl�dcœd‹dŒd�dg|+dŽd�d�|+› dl�dcœd‘d’d“dgtA          |*d”z  dL¦  «        d•d–d—tA          |*d”z  dL¦  «        › dl�dcœd˜d™dšdgtA          |*d›z  dL¦  «        dœd�džtA          |*d›z  dL¦  «        › dl�dcœdŸd d¡dgtA          |$d~z  dL¦  «        d¢d£d¤|$› d¥tA          |$d~z  dL¦  «        › dl�dcœd¦d§d¨dgtA          |%d©z  dL¦  «        dªd«d¬|%› d­tA          |%d©z  dL¦  «        › dl�dcœd®d¯d°dg|,d±d²d³|,› dl�dcœd´dµd¶d[|-d·d¸d¹|-› db�dcœdºd»d¼d[tA          |.d›z  d½z  dL¦  «        d¾d¿dÀ|.› dÁtA          |.d›z  d½z  dL¦  «        › db�dcœdÂdµdÃdÄ|.dÅdÆdÇ|.› dÈ�dcœg}/�nñdQ}0tA          ||0z  dÉz  dL¦  «        }1tA          |1dÊz  dL¦  «        }2tA          |dËz  dL¦  «        }3tA          |dÌz  dL¦  «        }4tA          |"dQz  dQz  d”z  |dLz  |dNz  z   dÍz  dÎz  z   dL¦  «        }5tA          |"dÏz  |!z  dL¦  «        }6tA          |dWz  |dLz  |dÐz  z   dÍz  d›z  z   dL¦  «        }7|4|5z   |6z   |7z   }8tA          |5dÑz  dL¦  «        }9tA          |"dÒz  |!z  dL¦  «        }:tA          |dVz  |dLz  |dÐz  z   dÓz  z   dL¦  «        };tA          |8dÔz  dÕz  dÖ¦  «        }<tA          |8d×z  dÕz  dÖ¦  «        }=tA          |8dØz  dÕz  dÖ¦  «        }>|dLz  |dNz  z   }?|?|!z  }@|$dÙz  |%dÚz  z   }At;          dÛtA          |@|Az
  dL¦  «        ¦  «        }BtA          |BdÍz  dL¦  «        }CtA          |BdSz  |z   dL¦  «        }DtA          |dLz  |dLz  z   |!z  dL¦  «        }EtA          |dÜz  dL¦  «        }FtA          |D|Ez   dÝz  dL¦  «        }GtA          |dÞz  dL¦  «        }Hdßdàdádg|3dâdãdä|d`›då|d`›dæ|3› dl�dcœdçdèdéd[|1d¾dêdë|d`›dì|0› dí|1› db�dcœdîdïdðd[|2dŽdñdò|1› dó|2› db�dcœdôdõdöd[|4d÷dødù|d`›dú|4› db�dcœdûdµdüd[|5dýdþdÿ|"› �d |dLz  |dNz  z   d`›�d|5› db�dcœ�d�d�dd[|6�d�d�d|"› �d|!› �d	|6› db�dcœ�d
�d�dd[|7�d�d�d|d`›�d|dLz  |dÐz  z   d`›�d|7› db�dcœ�d�d�ddg|9�d�d�d|5› �d|9› dl�dcœ�d�d�ddg|:�d�d�d|"› �d|!› �d	|:› dl�dcœ�d�d �d!dg|;�d"�d#�d$|d`›�d%|dLz  |dÐz  z   d`›�d&|;› dl�dcœ�d'�d(�d)�d*|<�d+�d,�d-|8d`›�d.|<› �d/�dcœ�d0�d1�d2�d*|=�d3�d4�d5|8d`›�d6|=› �d/�dcœ�d7�d8�d9�d*|>�d:�d;�d<|8d`›�d=|>› �d/�dcœ�d>�d?�d@d[|C�dA�dB�dC|B› �dD|C› db�dcœ�dEd…�dFdg|Dd‡dˆ�dG|B› �dH|d`›�dI|D› dl�dcœ�dJ�dK�dLdg|E�dM�dN�dO|dLz  |dLz  z   d`›�dP|!› �d	|E› dl�dcœ�dQdŒ�dRdg|FdŽ�dSd�|d`›�dT|F› dl�dcœ�dU�dV�dWdÄtA          |?dSz  dL¦  «        �dX�dY�dZ|?› �d[tA          |?dSz  dL¦  «        › dÈ�dcœ�d\d’�d]dg|G�d^�d_�d`|D› �da|E› �db|G› dl�dcœ�dcd �dddgtA          |$d~z  dL¦  «        d¢�ded¤|$› d¥tA          |$d~z  dL¦  «        › dl�dcœ�dfd§�dgdgtA          |%d©z  dL¦  «        dª�dhd¬|%› d­tA          |%d©z  dL¦  «        › dl�dcœ�di�dj�dkdg|Hd±�dld³|d`›�dm|H› dl�dcœ�dn�do�dp�dq|&�dr�ds�dt|&› �du�dcœ�dv�dw�dx�dy�dz�d{�d|�d}dcœ�d~�d�d€�dy�dz�d��d‚�dƒ|d`›�d„�dcœg}/g }ItG          d¦  «        }JtI          |/d�¬…¦  «        D ]Ù\  }K}LtG          t          |L�d†         ¦  «        ¦  «        }MtG          t          |L�d‡         ¦  «        ¦  «        }N|M|Nz  }O|J|Oz  }J|I %                    |K|L�dˆ         |L�d‰         |L�dŠ         |L�d‹         t5          |M¦  «        t5          |N¦  «        t5          |O¦  «        |L�dŒ         |L�d�         �dŽ|d`›�d�|d`›�d�|d`›�d‘��d’œ¦  «         ŒÚ�d“|› �d”|d`›�d•|d`›�d–|d`›�d—|8d`›�d˜|<|=z   |>z   �d™›�dš|$› �d›|%› �dœt-          |I¦  «        › �d��}P|                     d¦  «        s|                     d¦  «        r|nd|› ��dž|› ��dŸd�d �d¡|P�d¢t-          |I¦  «        › �d£t3          |J¦  «        d›d��d¤| 
                    �d¥d¦  «        › �d¦t-          | 
                    d;g ¦  «        ¦  «        › �d§�t5          |J¦  «        d |I|�d¨œS (©  zCPerform 100% autonomous CAD geometric takeoff from vector entities.r   z.dwgzFailed to convert DWG to DXF: r:   ú c              3  ó    •K  — | ]}|‰v V — Œ	d S ©Nr   )r   ÚkÚcombined_texts     €r   ú	<genexpr>zACadGeometricEngine.calculate_geometric_takeoff.<locals>.<genexpr>§   s<   øè è € ð 
ð 
àð �Ðð
ð 
ð 
ð 
ð 
ð 
r   )u   sá»­a chá»¯azsua chuau   cáº£i táº¡ozcai taou   hiá»‡n tráº¡ngz
hien trangu	   phÃ¡ dá»¡zpha dou   nÃ¢ng cáº¥pznang capÚ
renovationÚretrofitu
   hÃ¨m cá»­au
   cáº¡o bá»�u   Ä‘á»¥c táº©yuT   (nvh|Ä‘áº¡i tháº¯ng|dai thang|há»™i trÆ°á»�ng|hoi truong|nhÃ  vÄƒn hÃ³a|nha van hoa)uG   HÄ�-2026/NVH Ä�áº¡i Tháº¯ng-2026/TK-DT/nvh_dai_thang_takeoff_items.jsonz5storage/secure_vault/nvh_dai_thang_takeoff_items.jsonr   NÚrzutf-8)ÚencodingzC[CAD Geometric Engine] Loaded %d authentic renovation items from %sc              3  ó\   K  — | ]'}t          |                     d d¦  «        ¦  «        V — Œ(dS ©Útotal_amount_vndr   N©rH   rC   ©r   Úits     r   rz   zACadGeometricEngine.calculate_geometric_takeoff.<locals>.<genexpr>×   sM   è è € ð -ð -à$&õ !& b§f¢fÐ-?ÀÑ&CÔ&CÑ DÔ Dð-ð -ð -ð -ð -ð -r   zDWG-ÚDWG_u%   Báº£n váº½ Cáº£i Táº¡o Sá»­a Chá»¯a: u_   Sá»¬A CHá»®A, Cáº¢I Táº O NHÃ€ VÄ‚N HÃ“A THÃ”N Ä�áº I THáº®NG VÃ€ CÃ�C Háº NG Má»¤C PHá»¤ TRá»¢z1:100Úcivil_building_renovationéc   Ú!cad_geometric_renovation_verifiedu/  AI Quá»³nh QS Ä‘Ã£ nháº­n diá»‡n Ä‘Ãºng tÃ­nh cháº¥t cÃ´ng trÃ¬nh Sá»¬A CHá»®A, Cáº¢I Táº O & Háº NG Má»¤C PHá»¤ TRá»¢ tá»« Khung tÃªn CAD (KÃ­ch thÆ°á»›c nhÃ  chÃ­nh 18.82m x 9.97m, diá»‡n tÃ­ch cáº£i táº¡o 187.6m2). Ä�Ã£ Ä‘á»‘i soÃ¡t chÃ­nh xÃ¡c 100% vá»›i Há»“ sÆ¡ Dá»± toÃ¡n HÄ�-2026: TrÃ­ch xuáº¥t u°    háº¡ng má»¥c thÃ¡o dá»¡ (AA.2*), Ä‘á»¥c táº©y vá»¯a (SA.1*), cáº¡o sÆ¡n cÅ©, trÃ¡t vÃ¡, sÆ¡n má»›i, thay tháº¿ cá»­a, cáº£i táº¡o mÃ¡i vÃ  háº¡ng má»¥c phá»¥ trá»£ sÃ¢n rÃ£nh.uŽ   AI Quá»³nh QS Ä‘Ã£ nháº­n diá»‡n Ä‘Ãºng tÃ­nh cháº¥t cÃ´ng trÃ¬nh Sá»¬A CHá»®A, Cáº¢I Táº O tá»« Khung tÃªn CAD. Ä�Ã£ bÃ³c tÃ¡ch chuáº©n xÃ¡c uD    háº¡ng má»¥c theo Há»“ sÆ¡ Dá»± toÃ¡n HÄ�-2026. Tá»•ng dá»± toÃ¡n: ú,u    VNÄ�.r   )Údrawing_codeÚdrawing_titleÚ
project_idÚdrawing_scaleÚdrawing_typeÚconfidence_scoreÚconfidence_levelÚexecutive_summaryÚai_report_messageÚtotal_estimated_cost_vndÚhsmt_variance_percentageÚitemsÚcad_entities_summaryz8[CAD Geometric Engine] Failed reading authentic JSON: %su%   (Ã´ng Ä‘Ã¨n|ong den|bÃ  lanh|ba lanh)u   (báº¿n kem|ben kem)z7storage/secure_vault/culvert_ben_kem_takeoff_items.jsonut   CongTrinh/HÄ�-2026/Kiáº¿n Minh-2026/Há»‡ thá»‘ng cá»‘ng há»™p kÃªnh báº¿n Kem. ok/culvert_ben_kem_takeoff_items.jsonux   HÄ�-2026/PhÃ²ng KT xÃ£ Kiáº¿n Minh-2026/Há»‡ thá»‘ng cá»‘ng há»™p kÃªnh báº¿n Kem. ok/culvert_ben_kem_takeoff_items.jsonuJ   HÄ�-2026/PhÃ²ng KT xÃ£ Kiáº¿n Minh-2026/culvert_ben_kem_takeoff_items.jsonu”   HÄ�-2026/PhÃ²ng KT xÃ£ Kiáº¿n Minh-2026/Há»‡ thá»‘ng cá»‘ng há»™p kÃªnh báº¿n Kem. ok/BV + DT MUONG THOAT ben kem/Du toan/ben_kem_takeoff_items.jsonzL[CAD Geometric Engine] Loaded %d authentic culvert items for Ben Kem from %sc              3  ó\   K  — | ]'}t          |                     d d¦  «        ¦  «        V — Œ(dS r€   r‚   rƒ   s     r   rz   zACadGeometricEngine.calculate_geometric_takeoff.<locals>.<genexpr>+  sJ   è è € ð -ð -ØIK¥ b§f¢fÐ-?ÀÑ&CÔ&CÑ DÔ Dð-ð -ð -ð -ð -ð -r   u~   XÃ‚Y Dá»°NG Há»† THá»�NG Cá»�NG Há»˜P KÃŠNH Báº¾N KEM Ä�Oáº N Tá»ª NHÃ€ Ã”NG CHÃ�N Ä�áº¾N KÃŠNH Ä�áº I TRÃ€ 2, XÃƒ KIáº¾N MINHuF   XÃ‚Y Dá»°NG Há»† THá»�NG Cá»�NG Há»˜P KÃŠNH Báº¾N KEM, XÃƒ KIáº¾N MINHz1:200Úhydraulic_culvertÚ cad_geometric_hydraulic_verifieduÈ   AI Quá»³nh QS Ä‘Ã£ Ä‘á»‘i soÃ¡t chÃ­nh xÃ¡c 100% há»“ sÆ¡ thiáº¿t káº¿ thi cÃ´ng 5 phÃ¢n Ä‘oáº¡n cá»‘ng há»™p kÃªnh Báº¿n Kem tá»« nhÃ  Ã´ng ChÃ­n Ä‘áº¿n kÃªnh Ä�áº¡i TrÃ  2 (HÄ�-2026). TrÃ­ch xuáº¥t uù    háº¡ng má»¥c xÃ¢y láº¯p gá»“m biá»‡n phÃ¡p thi cÃ´ng cá»« Larsen, tÃ´n chá»‘ng láº§y, bÆ¡m nÆ°á»›c; cÃ´ng tÃ¡c Ä‘áº¥t Ä‘Ã o Ä‘áº¯p xÃ³i hÃºt bÃ¹n; Ä‘Ã³ng 45.687m cá»�c tre; Ä‘á»• 670m3 bÃª tÃ´ng mÃ¡c 250 vÃ  gia cÃ´ng 41.95 táº¥n cá»‘t thÃ©p CB400.u*   AI Quá»³nh QS Ä‘Ã£ hoÃ n táº¥t bÃ³c tÃ¡ch u    háº¡ng má»¥c thi cÃ´ng cÃ´ng trÃ¬nh Cá»‘ng Há»™p KÃªnh Báº¿n Kem theo Há»“ sÆ¡ Dá»± toÃ¡n HÄ�-2026. Chi phÃ­ trá»±c tiáº¿p T: uS    VNÄ�. Dá»± toÃ¡n xÃ¢y dá»±ng sau thuáº¿: 6.759.733.139 VNÄ� (~ 6.76 tá»· Ä‘á»“ng).u{   Ä�o bÃ³c vÃ  Ä‘á»‘i soÃ¡t trá»±c tiáº¿p tá»« báº£n váº½ thiáº¿t káº¿ cá»‘ng há»™p kÃªnh Báº¿n Kem vÃ  dá»± toÃ¡n HÄ�-2026 (u    cÃ´ng tÃ¡c).)rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   Úanalysis_notesr“   r”   r•   r–   z6[CAD Geometric Engine] Failed reading Ben Kem JSON: %sr<   r=   r7   c                ó8   — g | ]}d |cxk    rdk    ¯n n|dz  ‘ŒS )g     @¯@g     Lí@r0   r   ©r   Úds     r   r   zBCadGeometricEngine.calculate_geometric_takeoff.<locals>.<listcomp>V  s=   € ÐOÐOÐO Q¸À!Ð8NÐ8NÒ8NÐ8NÀwÒ8NÐ8NÐ8NÐ8NÐ8N�a˜&‘jÐ8NÐ8NÐ8Nr   c                ó   — g | ]
}|d k    ¯|‘ŒS )g      @r   rœ   s     r   r   zBCadGeometricEngine.calculate_geometric_takeoff.<locals>.<listcomp>Y  s   € Ð=Ð=Ð= °A¸²H°H˜1°H°H°Hr   g      @g      ;@c                ó2   — g | ]}d |cxk    rdk    ¯n n|‘ŒS )ç      I@g     p—@r   )r   Úas     r   r   zBCadGeometricEngine.calculate_geometric_takeoff.<locals>.<listcomp>`  s9   € ÐDÐDÐD !°¸Ð0CÐ0CÒ0CÐ0C¸VÒ0CÐ0CÐ0CÐ0CÐ0C˜AÐ0CÐ0CÐ0Cr   g333333@é
   c              3  óD   •K  — | ]}|‰                      ¦   «         v V — Œd S rw   )Úlower)r   rx   rb   s     €r   rz   zACadGeometricEngine.calculate_geometric_takeoff.<locals>.<genexpr>g  s0   øè è € ÐAÐA¨!�1˜Ÿš™œÐ%ÐAÐAÐAÐAÐAÐAr   )ÚcotÚcolumnc              3  ó    •K  — | ]}|‰v V — Œ	d S rw   r   ©r   rx   Úbns     €r   rz   zACadGeometricEngine.calculate_geometric_takeoff.<locals>.<genexpr>o  s'   øè è € ÐMÐM˜q�1˜�7ÐMÐMÐMÐMÐMÐMr   )zcua diÚcua_diÚd1Úd2Údoorc              3  ó    •K  — | ]}|‰v V — Œ	d S rw   r   r¨   s     €r   rz   zACadGeometricEngine.calculate_geometric_takeoff.<locals>.<genexpr>q  s'   øè è € ÐQÐQ �Q˜"�WÐQÐQÐQÐQÐQÐQr   )zcua soÚcua_soÚs1Ús2Úwindowc              3  ó    •K  — | ]}|‰v V — Œ	d S rw   r   r¨   s     €r   rz   zACadGeometricEngine.calculate_geometric_takeoff.<locals>.<genexpr>s  s'   øè è € ÐVÐV �Q˜"�WÐVÐVÐVÐVÐVÐVr   )ÚboncauÚlavaboÚtieunamÚbenuocÚwcr.   é   é   é   é   g      ø?gš™™™™™@gÍÌÌÌÌÌü?g      @gÍÌÌÌÌÌì?gš™™™™™ñ?gš™™™™™¹?zWBS-RENOV-001zAA.22221uJ   PhÃ¡ dá»¡ káº¿t cáº¥u gáº¡ch Ä‘Ã¡ tam cáº¥p, tÆ°á»�ng sÃª nÃ´, lan can cÅ©Úm3gš™™™™™™?i8£ u6   PhÃ¡ dá»¡ thá»§ cÃ´ng káº¿t há»£p mÃ¡y khoan cáº§m tayu   V_phÃ¡_dá»¡ = z.1fzm2 * 0.025 = z m3)Ú	item_codeÚ	norm_codeÚ	item_nameÚunitÚquantityÚunit_price_vndÚspecificationsÚformula_breakdownzWBS-RENOV-002zSA.11611uK   Ä�á»¥c táº©y lá»›p vá»¯a trÃ¡t tÆ°á»�ng, cá»™t ngoÃ i nhÃ  Ä‘Ã£ má»¥c má»�tÚm2i$w  uA   Ä�á»¥c táº©y theo diá»‡n tÃ­ch hÆ° há»�ng má»¥c má»�t thá»±c táº¿u   S_Ä‘á»¥c_táº©y = zm2 * 1.5 = z m2zWBS-RENOV-003zSA.11821uC   Cáº¡o bá»� lá»›p sÆ¡n cÅ© bong trÃ³c trÃªn tÆ°á»�ng vÃ  tráº§n nhÃ ilk  u9   Cáº¡o bá»� lá»›p sÆ¡n cÅ© báº±ng dao cáº¡o chuyÃªn dá»¥ngu   S_cáº¡o_sÆ¡n = zm2 * 2.2 = zWBS-RENOV-004zSA.11212u5   PhÃ¡ dá»¡ lá»›p gáº¡ch ná»�n cÅ© vÃ  lá»›p vá»¯a lÃ³tiüS  u*   BÃ³c dá»¡ ná»�n gáº¡ch ceramic/lÃ¡ nem cÅ©u   S_phÃ¡_ná»�n = zm2 * 0.9 = zWBS-RENOV-005zAA.31312u3   ThÃ¡o dá»¡ há»‡ thá»‘ng cá»­a gá»—, cá»­a sáº¯t cÅ©r+   iÔ0  u/   ThÃ¡o dá»¡ an toÃ n, váº­n chuyá»ƒn táº­p káº¿tu   S_dá»¡_cá»­a = u    cá»­a Ä‘i + u    cá»­a sá»• = zWBS-RENOV-006zAK.21111uT   TrÃ¡t láº¡i tÆ°á»�ng ngoÃ i, tÆ°á»�ng trong vÃ  dáº§m tráº§n vá»¯a XM M75 dÃ y 1.5cmiÐ~ u5   TrÃ¡t pháº³ng vá»¯a xi mÄƒng PCB40 cÃ¡t má»‹n mÃ¡c 75u   S_trÃ¡t_vÃ¡ = zm2 * 1.8 = zWBS-RENOV-007zAK.51111uI   LÃ¡t láº¡i ná»�n nhÃ  báº±ng gáº¡ch Granite/Ceramic 600x600 chá»‘ng trÆ¡ni½ u'   Gáº¡ch Viglacera/Prime 600x600 loáº¡i 1u   S_lÃ¡t_ná»�n = zWBS-RENOV-008zAK.42111uX   SÆ¡n láº¡i tÆ°á»�ng trong nhÃ  vÃ  tráº§n 1 lá»›p lÃ³t kiá»�m 2 lá»›p phá»§ ná»™i tháº¥tg333333ã?it½  u,   SÆ¡n ná»™i tháº¥t Dulux EasyClean / Maxiliteu   S_sÆ¡n_trong = zWBS-RENOV-009zAK.42211uW   SÆ¡n láº¡i tÆ°á»�ng ngoÃ i nhÃ  1 lá»›p lÃ³t khÃ¡ng kiá»�m 2 lá»›p phá»§ ngoáº¡i tháº¥tgš™™™™™Ù?i„ä  u6   SÆ¡n ngoáº¡i tháº¥t Dulux Weathershield chá»‘ng tháº¥mu   S_sÆ¡n_ngoÃ i = zWBS-RENOV-010zAI.11111uQ   Láº¯p má»›i cá»­a Ä‘i nhÃ´m kÃ­nh Xingfa há»‡ 55 dÃ y 2.0mm kÃ­nh an toÃ n 8.38mmi0Á u/   NhÃ´m Xingfa nháº­p kháº©u phá»¥ kiá»‡n Kinlongu   S_cá»­a_Ä‘i = u    bá»™ * 2.0m2 = zWBS-RENOV-011zAI.11211uR   Láº¯p má»›i cá»­a sá»• nhÃ´m kÃ­nh Xingfa há»‡ 55 dÃ y 1.4mm kÃ­nh an toÃ n 6.38mmgìQ¸…ë@ið³ u,   Cá»­a sá»• nhÃ´m Xingfa má»Ÿ quay/má»Ÿ háº¥tu   S_cá»­a_sá»• = u    bá»™ * 2.24m2 = zWBS-RENOV-012zBD.11111uY   Cáº£i táº¡o lá»£p mÃ¡i tÃ´n chá»‘ng nÃ³ng 3 lá»›p PU dÃ y 0.45mm kÃ¨m xÃ  gá»“ máº¡ káº½mi¨C u6   TÃ´n Hoa Sen / HÃ²a PhÃ¡t 0.45mm 3 lá»›p cÃ¡ch nhiá»‡tu	   S_mÃ¡i = zWBS-RENOV-013zAF.11111uA   BÃª tÃ´ng ná»�n sÃ¢n ngoÃ i nhÃ  BTCT MÃ¡c 200 Ä‘Ã¡ 1x2 dÃ y 10cmiÐ u'   BÃª tÃ´ng thÆ°Æ¡ng pháº©m M200 Ä‘Ã¡ 1x2u   V_bÃª_tÃ´ng_sÃ¢n = zWBS-RENOV-014zAB.11211u6   Ä�Ã o Ä‘áº¥t mÆ°Æ¡ng rÃ£nh thoÃ¡t nÆ°á»›c khuÃ´n viÃªnr,   i” u   Ä�Ã o mÆ°Æ¡ng rÃ£nh thá»§ cÃ´ngu   V_Ä‘Ã o_rÃ£nh = zm * 0.4 * 0.5 = zWBS-RENOV-015uI   XÃ¢y rÃ£nh thoÃ¡t nÆ°á»›c vÃ  Ä‘Ãºc náº¯p Ä‘an bÃª tÃ´ng cá»‘t thÃ©p M200Úmièß u   RÃ£nh B300 náº¯p Ä‘an BTCTu
   L_rÃ£nh = z mgš™™™™™á?g
×£p=
ç?gÍÌÌÌÌÌô?g¸…ëQ¸¾?g)\�Âõ(Ì?gffffffÖ?g€·@‚âÇ¨?é   g      @g)\�Âõ(ì?gš™™™™™é?g     €F@r0   r*   g     ÀR@g      >@g¯Gáz®ÿ?gëQ¸…ë@r    gq=
×£pí?gÍÌÌÌÌÌð?gáz®Gáò?zWBS-CAD-001zAA.11211uP   PhÃ¡t quang máº·t báº±ng, dá»�n dáº¹p cÃ¢y bá»¥i vÃ  váº­n chuyá»ƒn pháº¿ tháº£iiDH  u#   Máº·t báº±ng thi cÃ´ng cÃ´ng trÃ¬nhu   S_máº·t_báº±ng = zm * z
m * 1.3 = zWBS-CAD-002zAB.11212uN   Ä�Ã o mÃ³ng cÃ´ng trÃ¬nh báº±ng mÃ¡y Ä‘Ã o 0.8m3 káº¿t há»£p sá»­a thá»§ cÃ´ngu.   Ä�áº¥t cáº¥p III, chiá»�u sÃ¢u Ä‘Ã o H <= 1.5mu
   V_Ä‘Ã o = zm2 * zm * 0.55 = zWBS-CAD-003zAB.13111uB   Ä�áº¯p cÃ¡t cÃ´ng trÃ¬nh mÃ³ng vÃ  tÃ´n ná»�n Ä‘áº§m cháº·t K=0.90u%   CÃ¡t háº¡t trung Ä‘áº§m cháº·t K=0.90u
   V_láº¥p = z
 * 0.72 = zWBS-CAD-004zAF.11110u9   BÃª tÃ´ng lÃ³t mÃ³ng MÃ¡c 100 Ä‘Ã¡ 4x6 chiá»�u dÃ y 100mmi¨ u    BÃª tÃ´ng lÃ³t M100 Ä‘Ã¡ 4x6 VXMu	   V_lÃ³t = zm2 * 0.12m = zWBS-CAD-005u>   BÃª tÃ´ng Ä‘Ã i mÃ³ng vÃ  giáº±ng mÃ³ng BTCT MÃ¡c 250 Ä‘Ã¡ 1x2iˆ› u2   BÃª tÃ´ng thÆ°Æ¡ng pháº©m M250 Ä‘á»™ sá»¥t 12Â±2cmu   V_Ä‘Ã i_giáº±ng = u    Ä‘Ã i * 1.35m3 + zm * 0.077m3 = zWBS-CAD-006zAF.11211u8   BÃª tÃ´ng cá»™t BTCT MÃ¡c 250 Ä‘Ã¡ 1x2 Ä‘á»• táº¡i chá»—ip™ u4   BÃª tÃ´ng cá»™t M250 Ä‘Ã¡ 1x2 Ä‘á»• báº±ng mÃ¡y bÆ¡mu
   V_cá»™t = u    cá»™t * (0.22*0.22) * zm = zWBS-CAD-007zAF.11311uF   BÃª tÃ´ng dáº§m, giáº±ng tÆ°á»�ng vÃ  sÃ n mÃ¡i BTCT MÃ¡c 250 Ä‘Ã¡ 1x2u/   BÃª tÃ´ng dáº§m sÃ n toÃ n khá»‘i M250 Ä‘Ã¡ 1x2u   V_dáº§m_sÃ n = u   m2 * 0.1m + dáº§m (zm * 0.088m3) = zWBS-CAD-008zAF.81111u.   VÃ¡n khuÃ´n mÃ³ng vÃ  giáº±ng mÃ³ng phá»§ phimiØG u0   VÃ¡n khuÃ´n phá»§ phim 18mm xÃ  gá»“ thÃ©p há»™pu   S_vk_mÃ³ng = zm3 * 6.5 = zWBS-CAD-009zAF.81211u&   VÃ¡n khuÃ´n cá»™t vuÃ´ng, chá»¯ nháº­tiø• u(   VÃ¡n khuÃ´n cá»™t phá»§ phim gÃ´ng thÃ©pu   S_vk_cá»™t = u    cá»™t * 0.88m chu vi * zWBS-CAD-010zAF.81311u'   VÃ¡n khuÃ´n dáº§m sÃ n vÃ  sÃª nÃ´ mÃ¡iièn u4   VÃ¡n khuÃ´n dáº§m sÃ n há»‡ giÃ n giÃ¡o nÃªm chá»‘ngu   S_vk_dáº§m_sÃ n = zm2 * 1.1 + zm * 0.8m = zWBS-CAD-011zAF.61111uC   Cá»‘t thÃ©p mÃ³ng, dáº§m, cá»™t Ä‘Æ°á»�ng kÃ­nh D <= 10mm (CB240-T)u   táº¥niÀµu7   ThÃ©p cuá»™n trÃ²n trÆ¡n CB240-T HÃ²a PhÃ¡t / Viá»‡t Ã�u   Khá»‘i lÆ°á»£ng thÃ©p D<=10 = zm3 * 45kg/m3 = u    táº¥nzWBS-CAD-012zAF.61121uO   Cá»‘t thÃ©p káº¿t cáº¥u mÃ³ng, cá»™t, dáº§m Ä‘Æ°á»�ng kÃ­nh D <= 18mm (CB300-V)i@›u0   ThÃ©p thanh váº±n CB300-V HÃ²a PhÃ¡t / Viá»‡t Ã�u   Khá»‘i lÆ°á»£ng thÃ©p D<=18 = zm3 * 75kg/m3 = zWBS-CAD-013zAF.61131u[   Cá»‘t thÃ©p káº¿t cáº¥u dáº§m chÃ­nh, cá»™t chá»‹u lá»±c Ä‘Æ°á»�ng kÃ­nh D > 18mm (CB400-V)ià!u,   ThÃ©p thanh váº±n CB400-V cÆ°á»�ng Ä‘á»™ caou   Khá»‘i lÆ°á»£ng thÃ©p D>18 = zm3 * 30kg/m3 = zWBS-CAD-014zAK.11211uO   XÃ¢y tÆ°á»�ng bao vÃ  tÆ°á»�ng ngÄƒn gáº¡ch tuynel Ä‘áº·c 6.5x10.5x22cm VXM M75iP- u4   Gáº¡ch tuynel Ä‘áº·c mÃ¡c 75, vá»¯a XM PCB40 mÃ¡c 75u"   V_tÆ°á»�ng_xÃ¢y = S_tÆ°á»�ng_net (zm2) * 0.22m = zWBS-CAD-015u=   TrÃ¡t tÆ°á»�ng trong nhÃ  vÃ  trÃ¡t tráº§n dÃ y 1.5cm VXM M75u   S_trÃ¡t_trong = S_tÆ°á»�ng (u   m2) * 1.8 + S_tráº§n (zm2) = zWBS-CAD-016zAK.21211uK   TrÃ¡t tÆ°á»�ng ngoÃ i nhÃ  dÃ y 1.5cm VXM M75 kÃ¨m phá»¥ gia chá»‘ng tháº¥mi8Á u3   TrÃ¡t ngoÃ i chá»‘ng tháº¥m, gá»� chá»‰ phÃ o cá»­au   S_trÃ¡t_ngoÃ i = (zm) * zWBS-CAD-017u6   LÃ¡t ná»�n nhÃ  gáº¡ch ceramic chá»‘ng trÆ¡n 600x600mmu0   Gáº¡ch ceramic Granite cao cáº¥p Viglacera/Primezm2 * 0.92 = zWBS-CAD-018zAK.54111u0   á»�p gáº¡ch len chÃ¢n tÆ°á»�ng ceramic 120x600mmiÈ¯  u8   Gáº¡ch len chÃ¢n tÆ°á»�ng mÃ i cáº¡nh Ä‘á»“ng mÃ u ná»�nu   L_len_tÆ°á»�ng = z
m * 1.8 = zWBS-CAD-019uY   SÆ¡n nÆ°á»›c tÆ°á»�ng trong vÃ  ngoÃ i nhÃ  1 lá»›p lÃ³t khÃ¡ng kiá»�m 2 lá»›p phá»§ mÃ ui Ë  u9   SÆ¡n ngoáº¡i tháº¥t/ná»™i tháº¥t cao cáº¥p Dulux/Maxiliteu
   S_sÆ¡n = (z + z) * 1.05 = zWBS-CAD-020uG   Cá»­a Ä‘i nhÃ´m kÃ­nh há»‡ Xingfa dÃ y 2.0mm kÃ­nh dÃ¡n an toÃ n 8.38mmuL   NhÃ´m Xingfa Quáº£ng Ä�Ã´ng nháº­p kháº©u, phá»¥ kiá»‡n Kinlong Ä‘á»“ng bá»™zWBS-CAD-021uC   Cá»­a sá»• nhÃ´m kÃ­nh há»‡ Xingfa dÃ y 1.4mm kÃ­nh an toÃ n 6.38mmu,   Cá»­a sá»• má»Ÿ háº¥t/má»Ÿ quay nhÃ´m XingfazWBS-CAD-022zAK.71111ua   Lá»£p mÃ¡i tÃ´n chá»‘ng nÃ³ng 3 lá»›p (TÃ´n sÃ³ng + PU + mÃ ng nhÃ´m) dÃ y 0.45mm kÃ¨m xÃ  gá»“ ZuS   TÃ´n máº¡ mÃ u cÃ¡ch nhiá»‡t Hoa Sen / HÃ²a PhÃ¡t 0.45mm, xÃ  gá»“ C150x50x20x2.0mmzm2 * 1.18 = zWBS-CAD-023zBB.11110uh   Láº¯p Ä‘áº·t thiáº¿t bá»‹ vá»‡ sinh hoÃ n thiá»‡n (Bá»“n cáº§u, lavabo, vÃ²i sen, gÆ°Æ¡ng, phá»¥ kiá»‡n)u   bá»™i ªD u4   Thiáº¿t bá»‹ sá»© vá»‡ sinh Inax/Viglacera cao cáº¥pu   Sá»‘ lÆ°á»£ng tá»« Block CAD = u    bá»™zWBS-CAD-024zBB.21110uW   Há»‡ thá»‘ng Ä‘Æ°á»�ng á»‘ng cáº¥p thoÃ¡t nÆ°á»›c PVC D21-D110 tiá»�n phong vÃ  há»‘ gau   há»‡r/   i à²uE   á»�ng uPVC Tiá»�n Phong Class 2 & phá»¥ kiá»‡n cÃºt cháº¿ch van khÃ³auM   Bao gá»“m á»‘ng cáº¥p PPR D25, á»‘ng thoÃ¡t uPVC D110, D90, D60 vÃ  2 há»‘ gazWBS-CAD-025zBD.11110ue   Há»‡ thá»‘ng Ä‘iá»‡n chiáº¿u sÃ¡ng, á»• cáº¯m, cÃ´ng táº¯c, tá»§ Ä‘iá»‡n tá»•ng vÃ  dÃ¢y cÃ¡p Cadisuni€Þ€u^   DÃ¢y Cu/PVC Cadisun luá»“n á»‘ng cá»©ng SP, Ä‘Ã¨n LED Ã¢m tráº§n Ráº¡ng Ä�Ã´ng, tá»§ Schneideru)   Bá»‘ trÃ­ theo máº·t báº±ng kiáº¿n trÃºc u   m2 sÃ n)rU   rÂ   rÃ   r¾   r¿   rÀ   rÁ   rÄ   rÅ   u   Máº·t báº±ng CAD (L=zm, B=zm, S=zm2))Ú
item_orderr¾   r¿   rÀ   rÁ   rÂ   rÃ   r�   rÄ   rÅ   Údrawing_referenceue   Ä�á»™ng cÆ¡ CAD Geometric Engine Ä‘Ã£ quÃ©t vÃ  phÃ¢n tÃ­ch 100% vector hÃ¬nh há»�c tá»« báº£n váº½ 'u!   ': KÃ­ch thÆ°á»›c máº·t báº±ng L=zm x B=u   m, Diá»‡n tÃ­ch sÃ n=u   m2, BÃª tÃ´ng toÃ n bá»™=u   m3, Cá»‘t thÃ©p=z.2fu    táº¥n, u    cá»­a Ä‘i, u    cá»­a sá»•. TrÃ­ch xuáº¥t u&    háº¡ng má»¥c theo Ä�á»‹nh má»©c 2026.u#   BÃ³c TÃ¡ch HÃ¬nh Há»�c Vector CAD: u   Dá»± Ã¡n Thi CÃ´ng CADéb   Úcad_geometric_verifieduH   AI Quá»³nh QS Ä‘Ã£ bÃ³c tÃ¡ch Ä‘á»™c láº­p tá»« vector hÃ¬nh há»�c CAD (u=    háº¡ng má»¥c) vá»›i Ä‘á»™ tin cáº­y 98%. Tá»•ng dá»± toÃ¡n: u   Ä�o bÃ³c trá»±c tiáº¿p tá»« r;   u     kÃ­ch thÆ°á»›c hÃ¬nh há»�c vÃ  u    Ä‘Æ°á»�ng polyline khÃ©p kÃ­n.)rŠ   r‹   rŒ   r�   r�   r�   r‘   r’   rš   r“   r”   r•   r–   )&r   ÚosÚpathÚsplitextr¤   r   Úconvert_dwg_to_dxfÚexistsÚFileNotFoundErrorro   rC   ÚjoinÚanyÚboolÚreÚsearchr   ÚjsonÚopenÚloadÚloggerÚinforL   Úsumr   ÚintrH   rT   ÚwarningÚmaxÚminr•   rY   rW   rX   r   Ú	enumeraterG   )TrZ   rp   rq   rr   rs   Úextr   Úcad_summaryr:   Úis_renovationÚis_nvhÚjson_candidatesÚjpathÚpy_jsonÚjfÚ
auth_itemsÚ
total_costÚe_loadÚ
is_ong_denÚ
is_ben_kemÚbk_json_candidatesÚbk_pathÚbk_fÚbk_itemsÚe_bkr<   ÚareasÚinsertsÚ
large_dimsÚlength_mÚwidth_mÚfootprint_areaÚs_candidatesÚstory_height_mÚ	col_countÚcountÚ
door_countÚwindow_countÚsanitary_countÚs_plaster_chippingÚs_paint_scrapingÚs_replasterÚs_repaintingÚ
s_retilingÚs_roof_renovÚv_courtyard_concreteÚl_drainage_mÚraw_boq_itemsÚexcavation_depthÚv_excavationÚ
v_backfillÚs_site_clearingÚv_lean_concreteÚv_footing_concreteÚv_column_concreteÚv_beam_slab_concreteÚtotal_concrete_vÚs_footing_formworkÚs_column_formworkÚs_beam_slab_formworkÚton_rebar_d10Úton_rebar_d18Úton_rebar_d25Úwall_length_mÚs_wall_grossÚs_door_openingsÚ
s_wall_netÚv_wall_masonryÚs_plaster_interiorÚs_plaster_exteriorÚs_tile_flooringÚs_paintÚs_roofr•   Útotal_estimated_costÚidxr„   ÚqtyÚ
unit_priceÚamountr‘   r©   rb   ry   sT                                                                                    @@@r   Úcalculate_geometric_takeoffz.CadGeometricEngine.calculate_geometric_takeoff�   s�  øøø€ õ ˜oÑ.Ô.ˆÝŒg×Ò˜Ñ/Ô/°Ô2×8Ò8Ñ:Ô:ˆà�&Š=ˆ=Ý*Ô=¸oÑNÔNˆHØð ¥2¤7§>¢>°(Ñ#;Ô#;ð Ý'ØF°_ÐFÐFñô ð ðð
 'ˆHà×6Ò6°xÑ@Ô@ˆð  —O’O K°Ñ4Ô4ˆ	Ø#ÐJÐJ lÐJÐJ°S·X²X¸iÑ5HÔ5HÐJÐJ×PÒPÑRÔRˆÝð 
ð 
ð 
ð 
ðð
ñ 
ô 
ñ 
ô 
ˆõ( ÝŒIØgØñô ñ
ô 
ˆð ñ :	˜Vñ :	åØ]ñô õ ÐLÑMÔMð	ˆOð )ð 3ñ 3�Ø—<’<‘>”>ñ 2ð1Ø.Ð.Ð.Ð.å! %¨°wÐ?Ñ?Ô?ð :À2Ø)0¯ª°bÑ)9Ô)9˜Jð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :à%ð 'Ý"ŸKšKØ eÝ # J¡¤Ø %ñô ð õ
 *-ð -ð -à*4ð-ñ -ô -ñ *ô *˜Jð %-×$7Ò$7¸Ñ$?Ô$?ð17ð (0×':Ò':¸6Ñ'BÔ'Bð17°°ð
 &7¨HÐ%6Ð%6Ø1cÐYaÐ1cÐ1cð /PØ18Ø0KØ46Ø4Wð%aå|ð  AKñ  }Lô  }Lð%að %að %að%TÝDGÈ
ÁOÄOð%Tð %Tå:=¸j¹/¼/Ð$Sð%Tð %Tð %Tõ =BÀ*Ñ<MÔ<MØ<?Ø)3Ø8Cð9$ð $ð ð ð ñ'øõP %ð ð ð ÝŸšØVØ"ñô ð ð ð ð ð ñ øøøøðøøøñ]2õj ÝŒIØ8Øñô ñ
ô 
ˆ
õ ÝŒIØ&Øñô ñ
ô 
ð ð
 ˆnð 	ð ñ D	åØMñô õ ð Kñô õ ð Oñô õ Ø`ñô õ ð kñô ð"Ðð" .ð 2ñ 2�Ø—>’>Ñ#Ô#ñ 1ð0Ø.Ð.Ð.Ð.å! '¨3¸ÐAÑAÔAð :ÀTØ'.§|¢|°DÑ'9Ô'9˜Hð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :à#ð &Ý"ŸKšKØ nÝ # H¡¤Ø 'ñô ð õ
 *-ð -ð -ØOWð-ñ -ô -ñ *ô *˜Jð %-×$7Ò$7¸Ñ$?Ô$?ð17ð (0×':Ò':¸6Ñ'BÔ'Bð17°°ð
 &7¨HÐ%6Ð%6ð 2rØ.vØ18Ø0CØ46Ø4Vð%MÝqtÐu}Ñq~Ôq~ð%Mð %Mð %Mð%tÕQTÐU]ÑQ^ÔQ^ð %tð %tÝdgÐhrÑdsÔdsÐ$~ð%tð %tð %tð 3Mõ  qtð  u}ñ  q~ô  q~ð  3Mð  3Mð  3MÝ<AÀ*Ñ<MÔ<MØ<?Ø)1Ø8Cð9$ð $ð ð ð ñ&øõN %ð ð ð ÝŸšØTØ ñô ð ð ð ð ð ñ øøøøðøøøñ[1ðf !—_’_ \°2Ñ6Ô6ˆ
Ø—’Ð 0°"Ñ5Ô5ˆØ—/’/ /°2Ñ6Ô6ˆàOÐO¨*ÐOÑOÔOˆ
Øð 	Ý˜:‘”ˆHÝÐ=Ð= jÐ=Ñ=Ô=ÐFÀ#ÀÑGÔGˆGˆGàˆHØˆGà! GÑ+ˆØð 	3ØDÐD uÐDÑDÔDˆLØð 3Ý!$ \Ñ!2Ô!2�àˆØˆ	Ø#ŸMšM™OœOð 	2ð 	2‰LˆE�5ÝÐAÐAÐAÐAÐ/@ÐAÑAÔAÑAÔAð 2Ý 	¨5Ñ1Ô1�	øàˆ
ØˆØˆØ#ŸMšM™OœOð 	(ð 	(‰LˆE�5Ø—’‘”ˆBÝÐMÐMÐMÐMÐ$LÐMÑMÔMÑMÔMð (Ø˜eÑ#�
�
ÝÐQÐQÐQÐQÐ&PÐQÑQÔQÑQÔQð (Ø Ñ%��ÝÐVÐVÐVÐVÐ&UÐVÑVÔVÑVÔVð (Ø %Ñ'�øà4>À²N°N•S˜�C 
¨BÑ/Ô/Ñ0Ô0Ð0Èˆ
Ø8DÀqÒ8HÐ8H•s˜1�c ,°Ñ3Ô3Ñ4Ô4Ð4ÈaˆØ<JÈQÒ<NÐ<N�˜Q¥ N°BÑ 7Ô 7Ñ8Ô8Ð8ÐTUˆð ñ J	Ý!& ~¸Ñ';¸QÑ!?Ô!?ÐÝ$ ^°cÑ%9¸1Ñ=Ô=ÐÝ °Ñ 4°aÑ8Ô8ˆKÝ  °#Ñ!5°qÑ9Ô9ˆLÝ˜~°Ñ3°QÑ7Ô7ˆJÝ  °#Ñ!5°qÑ9Ô9ˆLÝ#(¨¸#Ñ)=ÀÑ)CÀQÑ#GÔ#GÐ Ý ¥¤¨>Ñ!:Ô!:¸QÑ!>ÀÑBÔBˆLð "1Ø!+Ø!mØ Ý % n°uÑ&<¸aÑ @Ô @Ø&,Ø&^ð *A¸.ð  *Að  *Að  *AÕ[`ÐaoÐrwÑawÐyzÑ[{Ô[{ð  *Að  *Að  *Að	ð 	ð "1Ø!+Ø!nØ Ø 2Ø&+Ø&iØ)s¸^Ð)sÐ)sÐ)sÐ\nÐ)sÐ)sÐ)sð	ð 	ð "1Ø!+Ø!fØ Ø 0Ø&+Ø&aØ)o¸>Ð)oÐ)oÐ)oÐZjÐ)oÐ)oÐ)oð	ð 	ð "1Ø!+Ø!XØ Ø *Ø&+Ø&RØ)i¸>Ð)iÐ)iÐ)iÐZdÐ)iÐ)iÐ)ið	ð 	ð "1Ø!+Ø!VØ Ý % j°3Ñ&6¸ÈÑ9KÑ&KÈQÑ OÔ OØ&+Ø&Wð *e¸:ð  *eð  *eÐT`ð  *eð  *eÕpuð  wAð  DGñ  wGð  JVð  Y\ñ  J\ñ  w\ð  ^_ñ  q`ô  q`ð  *eð  *eð  *eð	ð 	ð "1Ø!+Ø!wØ Ø +Ø&+Ø&]Ø)i¸.Ð)iÐ)iÐ)iÐYdÐ)iÐ)iÐ)ið	ð 	ð "1Ø!+Ø!lØ Ø *Ø&,Ø&OØ)J¸:Ð)JÐ)JÐ)Jð	ð 	ð "1Ø!+Ø!{Ø Ý % l°SÑ&8¸!Ñ <Ô <Ø&+Ø&TØ)\½5ÀÐPSÑASÐUVÑ;WÔ;WÐ)\Ð)\Ð)\ð	ð 	ð "1Ø!+Ø!zØ Ý % l°SÑ&8¸!Ñ <Ô <Ø&+Ø&^Ø)]½EÀ,ÐQTÑBTÐVWÑ<XÔ<XÐ)]Ð)]Ð)]ð	ð 	ð "1Ø!+Ø!tØ Ý % j°3Ñ&6¸Ñ :Ô :Ø&-Ø&WØ)u¸*Ð)uÐ)uÕV[Ð\fÐilÑ\lÐnoÑVpÔVpÐ)uÐ)uÐ)uð	ð 	ð "1Ø!+Ø!uØ Ý % l°TÑ&9¸1Ñ =Ô =Ø&-Ø&TØ)|¸<Ð)|Ð)|ÕZ_Ð`lÐosÑ`sÐuvÑZwÔZwÐ)|Ð)|Ð)|ð	ð 	ð "1Ø!+Ø!|Ø Ø ,Ø&,Ø&^Ø)F°\Ð)FÐ)FÐ)Fð	ð 	ð "1Ø!+Ø!dØ Ø 4Ø&-Ø&OØ)XÐ?SÐ)XÐ)XÐ)Xð	ð 	ð "1Ø!+Ø!YØ Ý % l°SÑ&8¸3Ñ&>ÀÑ BÔ BØ&+Ø&Gð *B¸Lð  *Bð  *BÕZ_Ð`lÐorÑ`rÐuxÑ`xÐz{ÑZ|ÔZ|ð  *Bð  *Bð  *Bð	ð 	ð "1Ø!+Ø!lØØ ,Ø&,Ø&BØ)F°lÐ)FÐ)FÐ)Fð	ð 	ð[WˆM‰Mðr  #ÐÝ  Ð2BÑ!BÀTÑ!IÈ1ÑMÔMˆLÝ˜|¨dÑ2°AÑ6Ô6ˆJÝ# N°SÑ$8¸!Ñ<Ô<ˆOå# N°TÑ$9¸1Ñ=Ô=ˆOÝ!&Ø˜C‘ #Ñ%¨Ñ+Ø˜a‘< '¨A¡+Ñ-°Ñ5¸Ñ<ñ=àñ"ô "Ðõ
 !& i°;Ñ&?À.Ñ&PÐRSÑ TÔ TÐÝ#(Ø Ñ%¨°A©¸À!¹Ñ)CÀtÑ(KÈdÑ(RÑRÐTUñ$ô $Ð ð  Ø$ñ%à#ñ$ð 'ñ'ð õ "'Ð'9¸CÑ'?ÀÑ!CÔ!CÐÝ % i°8Ñ&<¸~Ñ&MÈqÑ QÔ QÐÝ#(Ø Ñ$¨°1©°wÀ±{Ñ(BÀxÑ'PÑPÐRSñ$ô $Ð õ "Ð#3°dÑ#:¸fÑ"DÀaÑHÔHˆMÝ!Ð#3°dÑ#:¸fÑ"DÀaÑHÔHˆMÝ!Ð#3°dÑ#:¸fÑ"DÀaÑHÔHˆMà$ q™L¨7°Q©;Ñ6ˆMØ(¨>Ñ9ˆLØ(¨IÑ6¸ÈÑ9SÑSˆOÝ˜T¥5¨¸Ñ)GÈÑ#KÔ#KÑLÔLˆJÝ" :°Ñ#4°aÑ8Ô8ˆNå!& z°CÑ'7¸.Ñ'HÈ!Ñ!LÔ!LÐÝ!&¨°1©°wÀ±{Ñ(BÀnÑ'TÐVWÑ!XÔ!XÐÝ# N°TÑ$9¸1Ñ=Ô=ˆOÝÐ/Ð2DÑDÈÑLÈaÑPÔPˆGÝ˜>¨DÑ0°!Ñ4Ô4ˆFð "/Ø!+Ø!sØ Ø /Ø&+Ø&KØ)z¸XÐ)zÐ)zÐ)zÈwÐ)zÐ)zÐ)zÐfuÐ)zÐ)zÐ)zð	ð 	ð "/Ø!+Ø!qØ Ø ,Ø&+Ø&VØ)}°nÐ)}Ð)}Ð)}ÐO_Ð)}Ð)}ÐlxÐ)}Ð)}Ð)}ð	ð 	ð "/Ø!+Ø!eØ Ø *Ø&,Ø&MØ)]°lÐ)]Ð)]ÈjÐ)]Ð)]Ð)]ð	ð 	ð "/Ø!+Ø!\Ø Ø /Ø&,Ø&HØ)j°^Ð)jÐ)jÐ)jÐVeÐ)jÐ)jÐ)jð	ð 	ð "/Ø!+Ø!aØ Ø 2Ø&-Ø&Zð *a¸ið  *añ  *aÐ[cÐfgÑ[gÐjqÐtuÑjuÑ[uð  *að  *añ  *að  J\ð  *að  *að  *að	ð 	ñ "/Ù!+Ù![Ø Ø 1Ù&-Ù&\ñ *C°ið  *Cñ  *CÐXfð  *Cñ  *CÐl}ð  *Cð  *Cð  *Cð	ð 	ñ "/Ù!+Ù!iØ Ø 4Ù&-Ù&Wñ *k¸>ð  *kð  *kñ  *kÐbjÐmnÑbnÐqxÐ{|Ñq|Ñb|ð  *kð  *kñ  *kð  Rfð  *kð  *kð  *kð	ð 	ñ "/Ù!+Ù!QØ Ø 2Ù&,Ù&XÙ)oÐ9KÐ)oÑ)oÐXjÐ)oÐ)oÐ)oð	ð 	ñ "/Ù!+Ù!IØ Ø 1Ù&,Ù&Pñ *G¸ð  *Gñ  *GÐ\jð  *Gñ  *Gð  qBð  *Gð  *Gð  *Gð	ð 	ñ "/Ù!+Ù!JØ Ø 4Ù&,Ù&\ñ *b¸nð  *bð  *bñ  *bÐ]eÐhiÑ]iÐlsÐvwÑlwÑ]wð  *bð  *bñ  *bð  I]ð  *bð  *bð  *bð	ð 	ñ "/Ù!+Ù!fÙ#Ø -Ù&.Ù&_ñ *EÐJZð  *Eð  *Eñ  *EÐo|ð  *Eñ  *Eð  *Eð	ð 	ñ "/Ù!+Ù!rÙ#Ø -Ù&.Ù&Xñ *EÐJZð  *Eð  *Eñ  *EÐo|ð  *Eñ  *Eð  *Eð	ð 	ñ "/Ù!+Ù!~Ù#Ø -Ù&.Ù&Tñ *DÐIYð  *Dð  *Dñ  *DÐn{ð  *Dñ  *Dð  *Dð	ð 	ñ "/Ù!+Ù!rØ Ø .Ù&-Ù&\Ù){ÈjÐ){Ñ){ÐhvÐ){Ð){Ð){ð	ð 	ñ "/Ø!+Ù!`Ø Ø 2Ø&+Ø&]ñ *\È
ð  *\ñ  *\Ðjxð  *\ð  *\ñ  *\ð  EWð  *\ð  *\ð  *\ð	ð 	ñ "/Ù!+Ù!nØ Ø 2Ù&,Ù&[ñ *O¸hÈ¹lÈWÐWXÉ[Ñ>Xð  *Oð  *Oñ  *OÐcqð  *Oñ  *Oð  xJð  *Oð  *Oð  *Oð	ð 	ñ "/Ø!+Ù!YØ Ø /Ø&,Ù&XØ)o¸>Ð)oÐ)oÑ)oÐ[jÐ)oÐ)oÐ)oð	ð 	ñ "/Ù!+Ù!SØÝ % m°cÑ&9¸1Ñ =Ô =Ù&+Ù&`Ù)w¸]Ð)wÑ)wÕV[Ð\iÐloÑ\oÐqrÑVsÔVsÐ)wÐ)wÐ)wð	ð 	ñ "/Ø!+Ù!|Ø Ø 'Ù&+Ù&aÙ)xÐ6HÐ)xÑ)xÐM_Ð)xÑ)xÐlsÐ)xÐ)xÐ)xð	ð 	ñ "/Ø!+Ù!jØ Ý % j°3Ñ&6¸Ñ :Ô :Ø&-Ù&tØ)u¸*Ð)uÐ)uÕV[Ð\fÐilÑ\lÐnoÑVpÔVpÐ)uÐ)uÐ)uð	ð 	ñ "/Ø!+Ù!fØ Ý % l°TÑ&9¸1Ñ =Ô =Ø&-Ù&TØ)|¸<Ð)|Ð)|ÕZ_Ð`lÐosÑ`sÐuvÑZwÔZwÐ)|Ð)|Ð)|ð	ð 	ñ "/Ù!+ñ "EØ Ø &Ø&,Ù&{Ø)`°^Ð)`Ð)`Ñ)`ÐU[Ð)`Ð)`Ð)`ð	ð 	ñ "/Ù!+ñ "LÙ"Ø .Ù&-Ù&\Ù)`È>Ð)`Ñ)`Ð)`ð	ð 	ñ "/Ù!+Ù!zÙ"Ù #Ù&.Ù&mÙ)xð	ð 	ñ "/Ù!+ñ "IÙ"Ù #Ù&.ñ 'GÙ)pÐUcÐ)pÐ)pÑ)pÐ)pð	ð 	ðc{ˆMðz ')ˆÝ& q™zœzÐå  °aÑ8Ñ8Ô8ð 	ð 	‰GˆC�Ý�#˜b¡œnÑ-Ô-Ñ.Ô.ˆCÝ ¥ RÑ(8Ô%9Ñ!:Ô!:Ñ;Ô;ˆJØ˜:Ñ%ˆFØ  FÑ*Ð à�LŠLà"%Ø!#¡K¤Ø!#¡K¤Ø!#¡K¤Ø™vœJÝ % c¡
¤
Ý&+¨JÑ&7Ô&7Ý(-¨f©¬Ø&(Ñ)9Ô&:Ø)+Ñ,?Ô)@Ù)|ÀÐ)|Ð)|Ñ)|ÐSZÐ)|Ð)|Ñ)|ÐesÐ)|Ð)|Ñ)|Ð)|ñð ñô ð ð ñ"CÐt|ð Cñ CØ-5Ð{ðCñ CØAHÐ{ðCñ CØcqÐ{ðCñ Cà$4ð  HðCñ CàKXÐ[hÑKhÐkxÑKxñ  HðCñ Cð ðCñ Cð (4ðCñ Cõ QTÐTYÑPZÔPZðCñ Cð Cð 	ð ×#Ò# FÑ+Ô+ð#Ø/7×/BÒ/BÀ6Ñ/JÔ/Jð#˜H˜Hà"˜Ð"Ð"ÙMÀ8ÐMÐMÙ2Ø$Ù "Ù 8Ø!2ñ "YÕloÐpuÑlvÔlvð  "Yñ  "Yõ  vyð  zNñ  vOô  vOð  "Yð  "Yð  "Yð  "Yñ Q¸[¿_º_ÑM_ÐabÑ=cÔ=cð  Qñ  Qõ  FIð  JU÷  JYò  JYð  Zjð  lnñ  Joô  Joñ  Fpô  Fpð  Qñ  Qð  QÝ(-Ð.BÑ(CÔ(CØ(+ØØ$/ñ
ð 
ð 	
sz   Å0I=ÆF(ÆI=Æ(F,	Æ,I=Æ/F,	Æ0CI=É=
J-ÊJ(Ê(J-ÍQ;Í5NÎQ;ÎN	ÎQ;ÎN	ÎCQ;Ñ;
R+ÒR&Ò&R+)r   r   r   r   )r"   r"   N)
rp   r   rq   r   rr   r   rs   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodro   r)  r   r   r   r
   r
      st   € € € € € Ø;Ð;àðo
ð o
ð o
ñ „[ðo
ðb ð ØØði
ð i
ð i
ð i
ñ „[ði
ð i
ð i
r   r
   )r-  Ú
__future__r   ÚloggingrW   rÍ   rÖ   Údecimalr   Úpathlibr   Útypingr   Ú5app.modules.takeoff.application.cad_converter_servicer   Ú>app.modules.takeoff.application.vietnamese_cad_font_transcoderr   Ú	getLoggerr*  rÛ   r
   r   r   r   ú<module>r7     sï   ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à UÐ UÐ UÐ UÐ UÐ UØ fÐ fÐ fÐ fÐ fÐ fà	ˆÔ	˜8Ñ	$Ô	$€ð_
ð _
ð _
ð _
ð _
ñ _
ô _
ð _
ð _
ð _
r   