§
    ¶Àja(  ã                  óÀ   — 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 dd	lmZ dd
lmZ  ej        e¦  «        Z G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚAnyé   )ÚCadGeometricEngine)Úget_civil_takeoff_fallback)Úget_culvert_takeoff_fallback)Úget_kien_hai_takeoff_fallback)Úget_nvh_takeoff_fallback)Úget_revetment_takeoff_fallbackc                  ó,   — e Zd ZdZ	 	 	 	 	 	 	 	 ddd„ZdS )ÚDrawingVisionAnalyzerMixinzQMultimodal LLM extraction with autonomous dual grounding & attached HSMT pairing.Ú Úcivil_buildingNÚimage_base64ÚstrÚfilenameÚ
text_layerÚproject_typeÚdrawing_hintÚ	ext_pagesúlist[dict[str, Any]] | NoneÚfile_path_strÚattached_hsmt_pathú
str | NoneÚattached_hsmt_filenameÚreturnúdict[str, Any]c
              ƒ  óx  K  — |› d|› d|› d|› d|	pd› �	                      ¦   «         }
|r7t          j                             |¦  «        d                               ¦   «         nd}|dv rÃt          j                             |¦  «        r¤	 t
                               d|› d�¦  «         t          j        t          j
        |||t          | dd ¦  «        ¦  «        ƒ d {V —†}|r|                     d¦  «        r|S n4# t          $ r'}t
                               d	|› �¦  «         Y d }~nd }~ww xY wg }|�rot          j                             |¦  «        �rOt          j                             |¦  «        d                               ¦   «         }|d
k    rf	 t          | d¦  «        r t          j        | j        |¦  «        ƒ d {V —†}�nß# t          $ r&}t
                               d|¦  «         Y d }~�n´d }~ww xY w|dv �r§	 ddlm}  |¦   «         }t          j        |j        |¦  «        ƒ d {V —†}|�r@t+          |¦  «        D �]/\  }}|                     |                     d|dz   ¦  «        t/          |                     d|dz   ¦  «        ¦  «        |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        t1          |                     dd¦  «        ¦  «        t1          |                     dd¦  «        ¦  «        t1          |                     dd¦  «        ¦  «        dd|                     dd¦  «        › d|                     dd¦  «        › d�dœ
¦  «         �Œ1n2# t          $ r%}t
                               d|¦  «         Y d }~nd }~ww xY w|rt|	pt          j                             |¦  «        }t5          |¦  «        }d|› d|› d�}|                     d ¦  «        r|nd!|› �d"|› �d#|
v sd$|
v sd%|
v rd&nd'd(|› d)�d*d+|||d,œ	S t9          t;          j        d-|
¦  «        ¦  «        }t9          t;          j        d.|
¦  «        ¦  «        o| }t9          t;          j        d/|
¦  «        ¦  «        o| o| }t9          t;          j        d0|
¦  «        ¦  «        o| o| o| }|r.|	pd1}d2|› d3�}t?          ||d4d+|t          | dd ¦  «        ¬5¦  «        S |r.|	pd6}d7|› d8�}tA          ||d9d:|t          | dd ¦  «        ¬5¦  «        S |r.|	pd;}d<|› d8�}tC          ||d9d:|t          | dd ¦  «        ¬5¦  «        S |r.|	pd=}d>|› d?�}tE          ||d9d:|t          | dd ¦  «        ¬5¦  «        S t9          |	p|¦  «        }|rd*nd9}|rd+nd:} |r	d@|	› dA|› dB�ndC}!tG          |||| |	|!t          | dd ¦  «        ¬D¦  «        S )ENú r   r   )z.dwgz.dxfzB[CAD Geometric Engine] Executing 100% vector geometric takeoff on z...Ú_erp_clientÚitemsz=[CAD Geometric Engine] Fallback to standard analyzer due to: z.pdfÚextract_hsmt_items_from_pdfz:[VisionAnalyzer] Failed to extract HSMT items from PDF: %s)z.xlsxz.xlsr   )ÚTriSourceTruthGroundingÚsttÚ	norm_codeÚTTÚ	item_nameÚunitÚquantityÚbid_rateÚtotal_amountÚcivilzTheo HSMT Excel (ú))
Ú
item_orderÚwbs_coder%   r'   r(   r)   Úunit_price_vndÚtotal_amount_vndÚcategoryÚdimension_formulaz<[VisionAnalyzer] Failed to extract HSMT items from Excel: %su0   ThÆ°a sáº¿p, em Ä‘Ã£ trÃ­ch xuáº¥t thÃ nh cÃ´ng uC    háº¡ng má»¥c cÃ´ng tÃ¡c trá»±c tiáº¿p tá»« Há»“ sÆ¡ má»�i tháº§u 'z'.)úDWG-ÚDWG_r4   u   BÃ³c tÃ¡ch HSMT: Úcongu   kÃªnhÚkenhÚhydraulic_culvertr   u*   AI Quá»³nh QS: TrÃ­ch xuáº¥t tá»± Ä‘á»™ng u/    háº¡ng má»¥c tá»« HSMT e-GP/Excel thá»±c táº¿.éc   Úhsmt_verified)	Údrawing_codeÚdrawing_titleÚdrawing_typeÚai_analysis_notesÚconfidence_scoreÚconfidence_levelÚhsmt_reference_fileÚai_report_messager!   uT   (nvh|Ä‘áº¡i tháº¯ng|dai thang|há»™i trÆ°á»�ng|hoi truong|nhÃ  vÄƒn hÃ³a|nha van hoa)uS   (cá»‘ng|cong|kiáº¿n minh|kien minh|phong cáº§u|phong cau|culvert|báº¿n kem|ben kem)uD   (kÃ¨ Ä‘Ã¡|ke da|Ä‘a Ä‘á»™|da do|bá»� kÃ¨|bo ke|kÃªnh|kenh|revetment)uO   (kiáº¿n háº£i|kien hai|chiáº¿u sÃ¡ng|chieu sang|cs tong mb|háº¡ táº§ng|ha tang)zDU TOAN NVH THON DAI THANG.xlsuU   ThÆ°a sáº¿p, em Ä‘Ã£ tá»± Ä‘á»™ng tÃ¬m tháº¥y vÃ  liÃªn káº¿t Há»“ sÆ¡ má»�i tháº§u 'uV   ' cho báº£n váº½ NhÃ  vÄƒn hÃ³a Ä�áº¡i Tháº¯ng. Ä�á»™ tin cáº­y bÃ³c tÃ¡ch Ä‘áº¡t 98%.éb   )Ú
erp_clientzHSMT_KienMinh.pdfuB   ThÆ°a sáº¿p, em Ä‘Ã£ bÃ³c tÃ¡ch sÆ¡ bá»™ theo máº«u cá»‘ng há»™p (uE   ). Cáº§n bá»• sung file HSMT e-GP Ä‘á»ƒ chuáº©n hÃ³a danh má»¥c 100%.éK   Úpreliminaryu   Biá»ƒu_máº«u_má»�i_tháº§u.pdfuF   ThÆ°a sáº¿p, em Ä‘Ã£ bÃ³c tÃ¡ch sÆ¡ bá»™ theo máº«u kÃ¨ thá»§y lá»£i (u(   1.CS Tong mb KIáº¾N Háº¢I - 2.3.2026.dwguO   ThÆ°a sáº¿p, em Ä‘Ã£ bÃ³c tÃ¡ch sÆ¡ bá»™ theo máº«u háº¡ táº§ng chiáº¿u sÃ¡ng (uA   ). Cáº§n bá»• sung file HSMT e-GP Ä‘á»ƒ Ä‘á»‘i soÃ¡t thá»±c táº¿.uQ   ThÆ°a sáº¿p, em Ä‘Ã£ Ä‘á»‘i soÃ¡t khá»›p ná»‘i 100% vá»›i Há»“ sÆ¡ má»�i tháº§u 'u   ' cho báº£n váº½ 'u   ' (Ä‘á»™ tin cáº­y 99%).uõ   ThÆ°a sáº¿p, hiá»‡n táº¡i báº£n váº½ káº¿t cáº¥u nÃ y chÆ°a cÃ³ há»“ sÆ¡ má»�i tháº§u Ä‘Ã­nh kÃ¨m. Em Ä‘Ã£ bÃ³c tÃ¡ch sÆ¡ bá»™ hÃ¬nh há»�c vá»›i Ä‘á»™ tin cáº­y 75%. Sáº¿p cÃ³ thá»ƒ bá»• sung file HSMT Excel Ä‘á»ƒ nÃ¢ng Ä‘á»™ tin cáº­y lÃªn 99%.)r   r   r?   r@   Úhsmt_ref_fileÚai_report_msgrD   )$ÚlowerÚosÚpathÚsplitextÚexistsÚloggerÚinfoÚasyncioÚ	to_threadr   Úcalculate_geometric_takeoffÚgetattrÚgetÚ	ExceptionÚwarningÚhasattrr"   ÚerrorÚ:app.modules.takeoff.application.tri_source_truth_groundingr#   Úextract_hsmt_tender_itemsÚ	enumerateÚappendr   ÚfloatÚbasenameÚlenÚ
startswithÚboolÚreÚsearchr
   r   r   r	   r   )"Úselfr   r   r   r   r   r   r   r   r   Úcombined_textÚextÚ
cad_resultÚcad_errÚ
hsmt_itemsÚhsmt_extÚer#   Ú
tri_engineÚ	excel_rawÚidxÚitÚref_nameÚ
item_countÚai_msgÚis_nvhÚ
is_culvertÚis_revetmentÚis_kien_haiÚhsmt_refÚhas_hsmtÚ
conf_scoreÚconf_lvlÚmsgs"                                     úEC:\Projects\DSCons\app\modules\takeoff\application\vision_analyzer.pyÚanalyze_drawing_with_visionz6DrawingVisionAnalyzerMixin.analyze_drawing_with_vision   s®  è è € ð $ÐpÐp lÐpÐp°ZÐpÐpÀ-ÐpÐpÐRhÐRnÐlnÐpÐp×vÒvÑxÔxˆð =JÐQ�bŒg×Ò˜}Ñ-Ô-¨aÔ0×6Ò6Ñ8Ô8Ð8ÈrˆØÐ"Ð"Ð"¥r¤w§~¢~°mÑ'DÔ'DÐ"ðÝ—’ØkÐYfÐkÐkÐkñô ð õ $+Ô#4Ý&ÔBØ!ØØ Ý˜D -°Ñ6Ô6ñ$ô $ð ð ð ð ð ð �
ð ð & *§.¢.°Ñ"9Ô"9ð &Ø%Ð%øøÝð ð ð Ý—’Ø]ÐT[Ð]Ð]ñô ð ð ð ð ð ð øøøøðøøøð ,.ˆ
Øñ $	d¥"¤'§.¢.Ð1CÑ"DÔ"Dñ $	dÝ”w×'Ò'Ð(:Ñ;Ô;¸AÔ>×DÒDÑFÔFˆHØ˜6Ò!Ð!ðbÝ˜tÐ%BÑCÔCð Ý+2Ô+<Ø Ô<Ð>Pñ,ô ,ð &ð &ð &ð &ð &ð &˜
ùøõ !ð bð bð bÝ—L’LÐ!]Ð_`ÑaÔaÐaÐaÐaÐaÐaÑaøøøøðbøøøàÐ.Ð.Ñ.ðdðð ð ð ð ð ð "9Ð!8Ñ!:Ô!:�JÝ&-Ô&7Ø"Ô<Ð>Pñ'ô 'ð !ð !ð !ð !ð !ð !�Ið !ñ Ý'0°Ñ';Ô';ð ñ ™G˜C Ø&×-Ò-à24·&²&¸ÀÀaÁÑ2HÔ2HÝ03°B·F²F¸5À#ÈÁ'Ñ4JÔ4JÑ0KÔ0KØ13·²¸ÀTÑ1JÔ1JØ13·²¸ÀRÑ1HÔ1HØ,.¯FªF°6¸2Ñ,>Ô,>Ý05°b·f²f¸ZÈÑ6KÔ6KÑ0LÔ0LÝ6;¸B¿FºFÀ:ÈqÑ<QÔ<QÑ6RÔ6RÝ8=¸b¿fºfÀ^ÐUVÑ>WÔ>WÑ8XÔ8XØ07Ø9zÈRÏVÊVÐT^Ð`aÑMbÔMbÐ9zÐ9zÐeg×ekÒekÐlrÐtvÑewÔewÐ9zÐ9zÐ9zð!"ð !"ñô ð ñ øøõ !ð dð dð dÝ—L’LÐ!_ÐabÑcÔcÐcÐcÐcÐcÐcÐcøøøøðdøøøð ð 	Ø-ÐUµ´×1AÒ1AÐBTÑ1UÔ1UˆHÝ˜Z™œˆJð7À:ð 7ð 7Ø*2ð7ð 7ð 7ð ð ×&Ò&Ð'7Ñ8Ô8ð!'  à&˜HÐ&Ð&Ø!?°XÐ!?Ð!?à˜mÐ+Ð+¨w¸-Ð/GÐ/GÈ6ÐUbÐKbÐKbð !4Ð 3à%ð &NÐR\ð  &Nð  &Nð  &NØ$&Ø$3Ø'/Ø%+Ø#ðð ð õ" ÝŒIØgØñô ñ
ô 
ˆõ Ý”	ØjØ!ñô ñô ð ð �
ð 	õ Ý”	Ø[Ø!ñô ñô ð ð �
ðð �ð 	õ Ý”	ØfØ!ñô ñô ð ð �
ðð !Ð ðð �ð 	ð ð +	Ø-ÐQÐ1QˆHð NÐmuð  Nð  Nð  NˆFÝ+ØØØØØÝ" 4¨¸Ñ=Ô=ðñ ô ð ð ð  	Ø-ÐDÐ1DˆHð jÐZbð  jð  jð  jˆFÝ/ØØØØØÝ" 4¨¸Ñ=Ô=ðñ ô ð ð ð 	Ø-ÐPÐ1PˆHð nÐ^fð  nð  nð  nˆFÝ1ØØØØØÝ" 4¨¸Ñ=Ô=ðñ ô ð ð ð 
	Ø-Ð[Ð1[ˆHð sÐgoð  sð  sð  sˆFÝ0ØØØØØÝ" 4¨¸Ñ=Ô=ðñ ô ð õ Ð.ÐDÐ2DÑEÔEˆØ#Ð+�R�R¨ˆ
Ø&.ÐA�?�?°Mˆð ðIð  mÐ`vð  mð  mð  KSð  mð  mð  mð  mð Ið 	õ *ØØ%Ø'Ø%Ø0ØÝ˜t ]°DÑ9Ô9ð
ñ 
ô 
ð 	
sJ   ÂA-C5 Ã5
D&Ã?D!Ä!D&Æ0F> Æ>
G.ÇG)Ç)G.Ç7E3M+ Í+
NÍ5NÎN)r   r   r   r   Nr   NN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r}   © ó    r|   r   r      sT   € € € € € Ø[Ð[ð
 ØØ,ØØ15ØØ)-Ø-1ðF
ð F
ð F
ð F
ð F
ð F
ð F
rƒ   r   )Ú
__future__r   rP   ÚloggingrJ   rb   Útypingr   Úcad_geometric_enginer   Úvision_fallbacks_civilr   Úvision_fallbacks_culvertr   Úvision_fallbacks_kien_hair	   Úvision_fallbacks_nvhr
   Úvision_fallbacks_revetmentr   Ú	getLoggerr~   rN   r   r‚   rƒ   r|   ú<module>rŽ      s  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ð Ð à 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø >Ð >Ð >Ð >Ð >Ð >Ø BÐ BÐ BÐ BÐ BÐ BØ DÐ DÐ DÐ DÐ DÐ DØ :Ð :Ð :Ð :Ð :Ð :Ø FÐ FÐ FÐ FÐ FÐ Fà	ˆÔ	˜8Ñ	$Ô	$€ðI
ð I
ð I
ð I
ð I
ñ I
ô I
ð I
ð I
ð I
rƒ   