
    ը	f                       d Z ddlZddlZddlZddlZddlZddlZddlZ	 ddlm	c m
Z	 ddlmc m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mZmZ ddl m!Z! dd	l"m#Z#m$Z$ dd
l%m&Z& ddl'm(Z(m)Z) ddl*m+Z+ ddl,m-Z.  G d de/      Z0 G d de/      Z1 G d de1ejd                        Z3 G d de1ejh                        Z5 G d dejl                        Z7 G d de1      Z8 G d de8ejr                        Z: G d de8ejv                        Z< G d de1ejr                        Z= G d  d!      Z> G d" d#      Z? G d$ d%e      Z@ G d& d'e@      ZA G d( d)e@      ZB G d* d+ej                        ZDy# e$ r
 ddlm
Z	 Y \w xY w),a  
@package gmodeler.model

@brief wxGUI Graphical Modeler (base classes & read/write)

Classes:
 - model::Model
 - model::ModelObject
 - model::ModelAction
 - model::ModelData
 - model::ModelRelation
 - model::ModelItem
 - model::ModelLoop
 - model::ModelCondition
 - model::ModelComment
 - model::ProcessModelFile
 - model::WriteModelFile
 - model::WritePyWPSFile
 - model::WritePythonFile
 - model::ModelParamDialog

(C) 2010-2018 by the GRASS Development Team

This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.

@author Martin Landa <landa.martin gmail.com>
@PyWPS, Python parameterization Ondrej Pesek <pesej.ondrek gmail.com>
    N)ABCabstractmethod)ogl)	globalvar)utils)GMessage
GExceptionGError
RunCommandGWarningGetDefaultEncoding)UserSettings)GUICmdPanel)	GNotebook)ButtonIsDark)GraphicalModelerGrassInterfacetaskc                       e Zd ZdZd"dZd Zd"dZd"dZd Zd#dZ	d	 Z
d
 Zd Zd Zd#dZd Zd Zd"dZd Zd Zd Zd Zd Zd$dZd Zd Zd%dZd Zd&dZd"dZd Zd Zd Z d  Z!d! Z"y)'ModelzClass representing the modelNc                     t               | _        t        d      t        d      t        j                         d| _        t               | _        t               | _        || _	        y )Nmodelz,Script generated by wxGUI Graphical Modeler.namedescriptionauthor)
listitems_getpassgetuser
propertiesdict	variablesvariablesParamscanvas)selfr(   s     //usr/lib/grass83/gui/wxpython/gmodeler/model.py__init__zModel.__init__H   sL    V
 gJKLoo'
 #v    c                     | j                   S )zGet canvas or None)r(   r)   s    r*   	GetCanvaszModel.GetCanvasW       {{r,   c                     |s| j                   S t               }| j                   D ]   }t        ||      s|j                  |       " |S )z]Get list of model items

        :param objType: Object type to filter model objects
        )r    r   
isinstanceappend)r)   objTyperesultitems       r*   GetItemszModel.GetItems[   sH    
 ::JJ 	$D$(d#	$ r,   c                 b    | j                  |      }|D ]  }|j                         |k(  s|c S  y)zGet item of given id

        :param aId: item id

        :return: Model* instance
        :return: None if no item found
        N)r7   GetId)r)   aIdr4   ilistr6   s        r*   GetItemzModel.GetItemj   s9     g& 	Dzz|s"	 r,   c                 8    | j                   j                  |      S )zReturn list index of given item)r    indexr)   r6   s     r*   GetItemIndexzModel.GetItemIndexy   s    zz%%r,   c                 v    |rt        | j                  t                    S t        | j                               S )zGet number of itemsr4   )lenr7   ModelAction)r)   
actionOnlys     r*   GetNumItemszModel.GetNumItems}   s,    t}}[}9::4==?##r,   c                 R   t               }t        j                  |      D ]M  \  }}| j                  j	                  |      }|j                  |       | j                  j                  ||       O t        j                  | j                        }|D ]  }|j                  |       |j                         D ]n  }t        |t              r&| j                  j                  j                  |       9t        |t               sJ| j                  j                  j#                  |       p  y N)r   six	iteritemsr    popr3   insertwxClientDCr(   	MoveLinksGetBlockr2   	ModelLoopparent
DefineLoopModelConditionDefineCondition)r)   idxListr    oldIdxnewIdxr6   dcmos           r*   ReorderItemszModel.ReorderItems   s    !mmG4 	,NFF::>>&)DLLJJfd+	,  [[% 	;DNN2mmo ;b),KK&&11"5N3KK&&66r:	;	;r,   c                    t        dt        | j                              D ]  }| j                  |   j                         r!t	        | j                  |dz
     t
              sB| j                  |dz
     }| j                  |   | j                  |dz
  <   || j                  |<    d}| j                  D ](  }|j                  |       |j                          |dz  }* y )N   )rangerC   r    rP   r2   rQ   SetIdSetLabel)r)   idxitemPreviIdr6   s        r*   	NormalizezModel.Normalize   s    C

O, 	+C::c?++-*

37#Y3
  ::cAg.&*jjo

37#"*

3	+ JJ 	DJJsOMMO1HC	r,   c                     t        | j                        dk  ry| j                  d   j                         }|dkD  r|dz   S y)zUGet next id (data ignored)

        :return: next id to be used (default: 1)
        r]   r   )rC   r    r9   )r)   currIds     r*   	GetNextIdzModel.GetNextId   sA    
 tzz?QB%%'A:A:r,   c                     | j                   S )zGet model properties)r$   r.   s    r*   GetPropertieszModel.GetProperties   s    r,   c                 6    |r| j                   S | j                  S )zGet model variables)r'   r&   r)   paramss     r*   GetVariableszModel.GetVariables   s    '''~~r,   c                     || _         y)zSet model variablesNr&   )r)   datas     r*   SetVariableszModel.SetVariables   s	    r,   c                 "    t               | _        y)zReset modelN)r   r    r.   s    r*   ResetzModel.Reset   s    V
r,   c                    t               }t               }d}t        |t              rv|j                         D ]b  }|j	                  |       |j                         }t        |j                               dk  r|j	                  |       R|j	                  |       d nt        |t              r|j                         D ]j  }|j                         |k(  r|j                         n|j                         }|r||k7  rd}@|j	                  |       |sT||k7  sZ|j	                  |       l |sn|j	                  |       n\t        |t              rL|j                         D ]  }|j	                  |        | j                         D ]  }	|	j                  |        |r)|| j                  v r| j                  j                  |       ||fS )zRemove item from model

        :item: item to be removed
        :reference: reference item valid for deletion

        :return: list of related items to remove/update
        T   F)r   r2   rD   GetRelationsr3   GetDatarC   	ModelDataGetFromGetTorQ   r7   
UnSetBlockr    remove)
r)   r6   	referencerelListupListdoRemoverelrq   	otherItemactions
             r*   
RemoveItemzModel.RemoveItem   s    &dK(((* (s#{{}t((*+a/NN4(MM$'( i(((* .+.;;=D+@CIIKckkm	i!7$Hs#i!7NN9-. d#i(((* $s#$--/ (!!$'( 

*JJd#r,   c                 l    | j                  t              }|D ]  }|j                         |k(  s|c S  y)zFind action by idrB   N)r7   rD   r9   )r)   r:   alistr   s       r*   
FindActionzModel.FindAction   s9    k2 	F||~$	 r,   c                     t               }| j                         D ]B  }||j                         k(  s|j                         }|r|d   dk(  r2|j	                  |       D |S )zHGet list of maps of selected type

        :param prompt: to filter mapsr   %)r   rx   	GetPromptGetValuer3   )r)   promptmapsrq   mapNames        r*   GetMapszModel.GetMaps  s^     vLLN 	%D))--/'!*"3G$	% r,   c                 *   t               }| j                  t              }| j                  t              D ]R  }|j	                         D ]=  }|j                         }||vr|j                  |       ||v s-|j                  |       ? T |r||z  }|S )zGet list of data itemsrB   )r   r7   ry   rD   rw   rx   r3   r}   )r)   r5   	dataItemsr   r   dataItems         r*   rx   zModel.GetData  s    MM)M4	mmKm8 	/F**, /;;=6)MM(+y($$X./	/ iFr,   c                     | j                         D ]-  }|j                         |k(  s|j                         |k(  s+|c S  y)zFind data item in the model

        :param value: value
        :param prompt: prompt

        :return: ModelData instance
        :return: None if not found
        N)rx   r   r   )r)   valuer   rq   s       r*   FindDatazModel.FindData)  s?     LLN 	D}}%'DNN,<,F	 r,   c                 z
   t         j                  j                  t        j                  dd      }	 t        t        j                  |            }| j                  rd| j                  j                  }|j                  r|j                  |j                         |j                  r|j!                  |j                         |j"                  | _        |j$                  | _        |j&                  D ]  }t)        | |d   d   |d   d   |d   d   |d   d   |d	   |d
   |d   |d   	      }|d   r|j+                  d       | j-                  ||j/                         dz
         |j1                  |j3                         j5                                |j7                           |j8                  D ]  }t;        | |d   d   |d   d   |d   d   |d   d   |d   |d         }	|	j=                  |d          |	j?                  |d          |d   D ]y  }
| jA                  |
d
         }|
d   dk(  rtC        | |	||
d         }ntC        | ||	|
d         }|jE                  |
d          |jG                  |       |	jG                  |       { | j                  s|	jI                           |jJ                  D ]V  }tM        | |d   d   |d   d   |d   d   |d   d   |d   |d
         }| j-                  ||j/                         dz
         X |jN                  D ]V  }tQ        | |d   d   |d   d   |d   d   |d   d   |d   |d
         }| j-                  ||j/                         dz
         X |jJ                  D ]b  }| jS                  |d
   tL              }|jU                  |d          |d   D ]*  }| jS                  |t(              }|jW                  |       , d |jN                  D ]  }| jS                  |d
         }|d   jY                         D ]N  }t[               }|d   |   D ]$  }| jS                  |      }|j]                  |       & |jU                  ||        P |j_                         }|jY                         D ]  }||   D ]  }|jW                  |          |j`                  D ]V  }tc        | |d   d   |d   d   |d   d   |d   d   |d
   |d   !      }| j-                  ||j/                         dz
         X y# t        $ r}t        dj                  |            d}~ww xY w)"zLoad model definition stored in GRASS Model XML file (gxm)

        .. todo::
             Validate against DTD

        Raise exception on error.
        xmlzgrass-gxm.dtdz{}Nposr   r]   sizer   idlabelcomment)	rR   xywidthheightr   r   r   r   disabledF)r   r   r   )rR   r   r   r   r   r   r   intermediatedisplayrelsdirfromr   )rR   	fromShapetoShapeparampointstext)rR   r   r   r   r   r   r   rB   r    )branch)rR   r   r   r   r   r   r   )2ospathjoinr   WXGUIDIRProcessModelFileetreeparse	Exceptionr	   formatr(   rR   r   SetPositionr   SetSizer$   r&   actionsrD   EnableAddItemr9   SetValidGetTaskget_optionsGetLogrq   ry   SetIntermediateSetHasDisplayr   ModelRelationSetControlPointsAddRelationUpdateloopsrQ   
conditionsrT   r<   SetItemsSetBlockkeysr   r3   r7   commentsModelComment)r)   filenamedtdFilenamegxmXmlewinr   
actionItemrq   r   r   relationlooploopItem	conditionconditionItemra   br   r:   r    r   commentItems                          r*   	LoadModelzModel.LoadModel8  s    ggll9#5#5uoN	-%ekk(&;<F ;;++$$Czz

+{{FKK( !++)) nn 	 F$-"-"VnQ'f~a(F^$<Woy)
J j!!!%(LL)9)9);a)?L@
 2 2 4 @ @ BC'	 , KK #	"D u+a.u+a.6l1oF|AH~7mH $$T.%9:""4	?3F| /!__SY7
u:',#"* *!&k	 H  -#", (!&k	 H ))#h-8&&x0$$X.'/* {{!G#	"L LL 
	=D u+a.u+a.6l1oF|A6l:H LLx~~'7!';L<
	=  ** 
	GI*E"1%E"1%'* (+'T?M LLM,?,?,AA,ELF
	G LL 	*D||DJ	|BHd7m,G} *c;?)*	*  ** 	3I LL49Mw',,. 8$W-a0 )C!\\#.FLL() &&uQ&78 "**,EZZ\ 3#Ah 3FOOM233	3  	CG&%.#%.#foa(vq)4=foK LL+*;*;*=*ALB	Cw  	-T[[^,,	-s   T 	T:T55T:c                 ~    |dk7  r| j                   j                  ||       y| j                   j                  |       y)zAdd item to the listrf   N)r    rL   r3   )r)   newItemr   s      r*   r   zModel.AddItem  s/    "9JJc7+JJg&r,   c                 &    | j                         ryy)zReturn True if model is validFT)Validater.   s    r*   IsValidzModel.IsValid  s    ==?r,   c                    t               }| j                         j                         }t        j                  d      }| j                  t              D ]-  }|j                  d      t        d      j                        }|t        fd|j                               z  }d	d D ]  }d
|vr|j                  d
d	      \  }}|j                  |      }	|	s1|	j                  d      j                         d	d }
d}|D ]  }|
j!                  |      sd} n |rtd}t#        d |j%                               D ]  }|
|j'                         v sd} n |s|j)                  d   dz   t+        d      |
z  z           0 |S )zLValidate model, return None if model is valid otherwise
        error string(.*)(%.+\s?)(.*)rB   FstringNshowcmdc                     d   dz   | z   S )Nr   :  )r   r   s    r*   <lambda>z Model.Validate.<locals>.<lambda>  s    SVd]Q%6 r,   r]   =rv   Tc                 "    t        | t              S rH   )r2   rQ   r   s    r*   r   z Model.Validate.<locals>.<lambda>  s    jI&> r,   r   r   undefined variable '%s')r   rn   r   recompiler7   rD   r   r   ParseCommandmapget_cmd_errorsplitsearchgroupstrip
startswithfilterrP   GetLabelr3   r!   )r)   errListr&   patternr   r   optkeyr   svalvarfoundvreportr6   r   s                  @r*   r   zModel.Validate  s    &%%',,.	**01mmKm8 	F--u--CD>..3.7Ds68J8J8LMMG 12w c> YYsA.
U~~e,**Q---/3C!E& ">>!,$(E!" !!%$*>@Q% &D  #dmmo5). %& "#NN #A2K0Ls0R R+	D r,   c           	         t               }t               | _        |j                         d   D ]  }|j	                  dd      dk(  s|j	                  dd      dk(  s/|j	                  dd      dk(  sE|j	                  d	|j	                  d
d            }|sjt        j                  |      d   dk(  sd| j                  |<    | j                  D ]  }t        |d      }	 |j                         x}	| j                  |<   |j                          d}
| j                         }|D ]  }t        j                  d|z         }d}|rkd|v rg|d   d   D ]\  }||j	                  dd      k(  s|j	                  dd      dk(  r|j	                  d	d      }nt        |j	                  d	d            } n |s||   j	                  d	d      }|j                  ||	      }	|rd}
 t        j                  d      }|j                  |	      }|rZ|j!                  d      j#                         dd }|j%                  d      d   }|j'                  |dz   t)        d      |z  z          |r|
r0t        |d      }	 |j+                  |	       |j                          d| j                  |<    |S # |j                          w xY w# |j                          w xY w)zSubstitute variables in command file inputs

        :param bool checkOnly: tuble - True to check variable, don't touch files

        :return: list of undefined variables
        rm   element filer   inputageoldr   defaultr   z
text/plainNrFr   r&   r   typer   Tr   rv   r]   r   r   r   w)r   r%   	fileInput	GetParamsget	mimetypes
guess_typeopenreadclosern   r   r   strsubr   r   r   r   r3   r!   write)r)   r6   rm   	checkOnlyr   pr   finputfdrq   r  r&   variabler   r   r   r  r   s                     r*   _substituteFilezModel._substituteFile
  s    & !(+ 	4Ai$.EE(B'72EE%$-55!%%	2*>?	 4 4X >q A\ Q/3DNN8,	4 nn -	2Ffc"B02	9t~~f-
 E))+I% !**S8^4kV3#K0: "#quuVR'88 uuVX6(B()gr(:(+AEE'2,>(?!" %h/33GR@E{{5$/  E#!& jj!45G>>$'Djjm))+AB/kkk/2sTzA.G,H3,NNOfc*B#
-1DNN6*[-	2^ S 
J 
s   !J*3J?*J<?Kc                 ,    | j                  ||d       y )NF)r  )r   )r)   r6   rm   s      r*   	OnPreparezModel.OnPrepareQ  s    T6U;r,   c                    dj                  |j                         |j                               }||v r&|j                  d      }|j	                  ||          |r|j                  t        d      d       |t        j                  |      d}	|j                  |j                  d|      || j                  |		       ||v r|j                         y
y
)a  Run given action

        :param item: action item
        :param params: parameters dict
        :param log: logging window
        :param onDone: on-done method
        :param onPrepare: on-prepare method
        :param statusbar: wx.StatusBar instance or None
        	({0}) {1}T)dcopyzRunning model...r   )r6   rm   F)r   
substitute)commandonDone	onPrepareuserDataN)r   r9   r   r  MergeParamsSetStatusTextr!   copydeepcopyRunCmdr   r"  	SetParams)
r)   r6   rm   logr(  r)  	statusbarr   
paramsOrigrq   s
             r*   	RunActionzModel.RunActionT  s     !!$**,@6>d3JVD\*##A&8$91=f(=>

KKuK@nn	 	 	
 6>NN:& r,   c           
      6   | j                         dk  rt        |t        d             yd}t        |t        j
                        r|j                         }|r|j                  t        d      d       | j                         }|r|j                  dd       |rt	        j                  |t        d      d	j                  |      z  t        d
      t        j                  t        j                  z  t        j                  z  t        j                  z        }|j                         }|j!                          |t        j"                  k7  ry| j%                         }d}	|rUt'        || |      }|j)                          |j                         }|t        j*                  k7  r|j!                          y|j-                         }
|j/                         }	|j!                          |
rt1        |d	j                  |
             yt3               }
t5        j6                  |      D ]Y  \  }}|d   D ]L  }|j9                  dd      dk(  s|
j;                  ||j9                  dd      |j9                  dd      f       N [ |
r7t1        |t        d      dz   d	j                  t=        d |
            z          y|j>                  jA                  d       | jC                         D ]v  }|jE                         st        |tF              r%|jI                         r6| jK                  |||       Jt        |tL              s[|jO                         }| jQ                         }|D ]  }tS        jT                  d|z         }|jW                  |      s-d}|r:d|v r6|d   d   D ]+  }||j9                  dd      k(  s|j9                  dd      } n |s||   j9                  dd      }|s||   j9                  dd      }|dk(  rd|z   dz   }|jY                  ||      } t=        d tS        jZ                  d|            \  }}tS        jT                  d|z         }t3               }|d   dk(  rS|d   dk(  rKt]        j^                  |dd j[                  d            \  }}ta        |fdd i|}|r|jc                         }nte        |      }d|vrdg i|d<   |dd!}|d   d   j;                  |       |D ]P  }|jC                  | jC                               D ],  }|jE                         s||d<   | jK                  |||"       . R |d   d   jg                  |       y |	r| j/                  |       |r*t5        jh                  |      D ]  }|d   D ]  }d|d<   	  yy)#zRun model

        :param log: logging window (see gconsole.GConsole)
        :param onDone: on-done method
        :param parent: window for messages or None
        r]   zModel is empty. Nothing to run.)rR   messageNzValidating model...r   r  z<Model is not valid. Do you want to run the model anyway?

%s
z
Run model?)rR   r6  captionstyleF)rR   r   rm   rm   r   r   r   zVariables below not defined:z

c                 *    | d   d| d   d| d   dS )Nr   r   r]    (rv   )r   r   s    r*   r   zModel.Run.<locals>.<lambda>  s    qtQqT1Q4.P r,   rf   r   r&   r  r   "c                 "    | j                         S rH   r   r   s    r*   r   zModel.Run.<locals>.<lambda>      aggi r,   
\s* in \s*` r  T)r   r   )r6   rm   r1  )5rF   r   r!   r2   rM   FrameGetStatusBarr,  r   MessageDialogr   YES_NO
NO_DEFAULTICON_QUESTIONCENTRE	ShowModalDestroyID_YESParameterizeModelParamDialogCenterOnParentID_OK	GetErrorsDeleteIntermediateDatar
   r   rI   rJ   r  r3   r   	cmdThreadr_   r7   	IsEnabledrD   
GetBlockIdr4  rQ   r   rn   r   r   r   r  r   gtaskcmdlist_to_tupler   
splitlinesevalr}   
itervalues)r)   r1  r(  rR   r2  r   dlgretrm   delInterDataerrr   r6   r  condr&   r  r   r   vtypecondVarcondTextvlistr   dcmdvarDictr  r   s                               r*   Runz	Model.Runq  sM    !FA.O,PQ	fbhh'++-I ##A&;$<a@--/##B*""W ))G$% ,ii"--/"2B2BBRYYNC --/CKKMbii ""$"&VLC --/Cbhh--/C557LKKMfdiin=&C ]]62 W	Th WAuuWb)R/

Cvr):AEE-QS<T#UVWW !<=ii$PRU VWX BMMO ?	>D>>#$,??$tVS1D),}} !--/	 ) 8H jjx8G~~d+ "!kV&;%+K%8%B *#+quuVR/@#@,-EE'2,>E$)*
  %$-h$7$;$;GR$HE$$ )( 3 7 7 I H,$'%K#$5E&{{5$7'8. %(',)E%! **S7]3A;#%(2,#*= % 6 6x"~7K7KC7P QIC$S<t<t<C # 0 NEf,+3R.F;'#*R8{#H-44W=  LC"&--"@ L%//1$+.(F6sKLL {#H-44W=?	>B '', v. $h $A!#AgJ$$ r,   c           	      &   | j                         \  }}}}|r'|j                  dddddj                  |      z  g       |r'|j                  dddddj                  |      z  g       |r(|j                  dddddj                  |      z  g       yy)	zDetele intermediate datazg.removez-fztype=rasterzname=%s,ztype=raster_3dztype=vectorN)GetIntermediateDatar/  r   )r)   r1  rastvectrast3dmsgs         r*   rS  zModel.DeleteIntermediateData  s    "&":":"<dFCJJ
D-SXXd^9STUJJT#3Y&AQ5QR JJ
D-SXXd^9STU r,   c                 N   t               }t               }t               }| j                         D ]x  }|j                         s|j                         }|j	                         }|dk(  r|j                  |       K|dk(  r|j                  |       b|dk(  sh|j                  |       z d}|r%|dt        d      z  z  }|dj                  |      z  }|r%|dt        d      z  z  }|dj                  |      z  }|r%|dt        d	      z  z  }|dj                  |      z  }||||fS )
z Get info about intermediate datarastervector	raster_3dr  z

%s: zRaster maps, z3D raster mapszVector maps)r   rx   IsIntermediater   r   r3   r!   r   )r)   rk  rm  rl  rq   r   r   rn  s           r*   rj  zModel.GetIntermediateData  s!   vvLLN 
	$D&&(==?D^^%F!D!8#D!;&d#
	$ :- 000C499T?"C:"2 333C499V$$C:- 000C499T?"CT63&&r,   c                 F    | j                   D ]  }|j                           y)zUpdate modelN)r    r   r?   s     r*   r   zModel.Update,  s    JJ 	DKKM	r,   c                 &    | j                         ryy)z%Return True if model is parameterizedTF)rN  r.   s    r*   IsParameterizedzModel.IsParameterized1  s    r,   c           	      X   t               }d}| j                  rt               }t               ||d|d<   t        j                  | j                        D ]  \  }}|j                  dd      }|dv rd}|}|dk(  rd	}	n|}	d}
nd
}d}d}	|}
|j                  i d|dd
d|j                  dd      ddddddddd|j                  dd      dddddddt               dd
dt               d|d|	d|
d|i        |dz  }| j                  t              D ]  }|j                         sd j                  |j                         |j                               }|j                         }d
}|d!   D ]K  }|j                  dd
      s||vrd}t               t               |d||<   ||   d!   j                  |       M |d"   D ]K  }|j                  dd
      s||vrd}t               t               |d||<   ||   d"   j                  |       M |s|dz  } || _        |S )#zReturn parameterized optionsr   )flagsrm   ra   r&   r  r   )rp  rq  mapsetr  regionr   Trp  cellFN	gispromptmultipler   r  guidependencyr  r
  requiredr   r   
guisectionkey_descvaluesparameterizedvalues_descr   r  r   r]   rB   r$  ry  rm   )r%   r&   r   rI   rJ   r  r3   r7   rD   rU  r   r9   r   r  r'   )r)   r5   ra   rm   r   r  gtyper}  r   r  ptyper   	incrementfr  s                  r*   rN  zModel.Parameterize8  s   >>VF,0FfS"QF; #dnn = $f

684SS $I"F("("'$E %I!F"G!E#Y"E &vzz-'D (	
 "2 t #D  GR!8   %b #B !$& ( &tv !&  "7!" #$ %$L 1HCmmKm8 	F##%%%fllnfoo6GHD%%'FIG_ 455%06)$(	1546RU'Vt4L)0034 H% 555%06)$(	1546RU'Vt4L*11!45 q'	*  &r,   rH   F)rf   )NF)NNN)#__name__
__module____qualname____doc__r+   r/   r7   r<   r@   rF   r[   rd   rh   rj   rn   rr   rt   r   r   r   rx   r   r   r   r   r   r   r"  r4  rg  rS  rj  r   rw  rN  r   r,   r*   r   r   E   s    &&$;6&*X&SCj')VEN<':N$`V'<
Fr,   r   c                   n    e Zd ZddZd Zd ZddZd Zd Zd Z	dd	Z
d
 ZddZd Zd Zd Zd Zd Zy)ModelObjectc                 j    || _         d| _        t               | _        d| _        t               | _        y )Nr  T)r   r   r   r   	isEnabledinBlock)r)   r   r   s      r*   r+   zModelObject.__init__  s)    
F	vr,   c                      y rH   r   r.   s    r*   __del__zModelObject.__del__      r,   c                     | j                   S )z	Get labelr   r.   s    r*   r   zModelObject.GetLabel      zzr,   c                     || _         y)z	Set labelNr  r)   r   s     r*   r`   zModelObject.SetLabel  s	    
r,   c                     | j                   S )zGet idr   r.   s    r*   r9   zModelObject.GetId  s    wwr,   c                     | j                   r-| j                   D ]  }|j                  | j                  |         || _        y)zSet idN)r  
UpdateItemr   )r)   newIdr   s      r*   r_   zModelObject.SetId  s7    << 0/0 r,   c                 :    | j                   j                  |       y)zRecord new relationNr   r3   r)   r   s     r*   r   zModelObject.AddRelation      		r,   Nc                     || j                   S t               }| j                   D ]R  }|dk(  r&|j                         | k(  s|j                  |       .|j	                         | k(  sB|j                  |       T |S )zIGet list of relations

        :param bool fdir: True for 'from'
        r   )r   r   rz   r3   r{   )r)   fdirr5   r   s       r*   rw   zModelObject.GetRelations  so    
 <9999 	'Cv~;;=D(MM#&99;$&MM#&	' r,   c                     | j                   S )z.Get True if action is enabled, otherwise False)r  r.   s    r*   rU  zModelObject.IsEnabled      ~~r,   c                 2    || _         | j                          yzEnable/disable actionN)r  r   )r)   enableds     r*   r   zModelObject.Enable  s     r,   c                      y rH   r   r.   s    r*   r   zModelObject.Update  r  r,   c                 X    || j                   vr| j                   j                  |       yy)zAdd object to the block (loop/condition)

        :param item: reference to ModelLoop or ModelCondition which
                     defines loops/condition
        N)r  r3   r?   s     r*   r   zModelObject.SetBlock  s'     t||#LL% $r,   c                 X    || j                   v r| j                   j                  |       yy)zRemove object from the block (loop/consition)

        :param item: reference to ModelLoop or ModelCondition which
                     defines loops/codition
        N)r  r}   r?   s     r*   r|   zModelObject.UnSetBlock  s'     4<<LL%  r,   c                     | j                   S )zGet list of related ModelObject(s) which defines block
        (loop/condition)

        :return: list of ModelObjects
        )r  r.   s    r*   rP   zModelObject.GetBlock  s     ||r,   c                 z    t               }| j                  D ]!  }|j                  |j                                # |S )zRGet list of related ids which defines block

        :return: list of ids
        )r   r  r3   r9   )r)   r]  rZ   s      r*   rV  zModelObject.GetBlockId  s7    
 f,, 	#BJJrxxz"	# 
r,   )rf   r  r  rH   T)r  r  r  r+   r  r   r`   r9   r_   r   rw   rU  r   r   r   r|   rP   rV  r   r,   r*   r  r    sM    &
&&	r,   r  c                       e Zd ZdZ	 	 	 	 	 	 	 ddZddZd Zd Zd ZddZ	d	 Z
d
 Zd Zd ZddZd ZddZd Zd Zd Zd Zd Zd Zd Zd ZddZd Zy)rD   zAction class (GRASS module)Nc                    t         j                  | ||	       || _        || _        |
| _        |st        j                  ddd      }|st        j                  ddd      }|r"t        d       j                  |      | _        n|r|| _        nd | _        d | _	        t               | _        d| _        d| _        | j                  j                         r7t        j                   j                  | ||       t        j"                         | _        | j$                  j'                  t        j(                  t        j*                  z         | j-                  | j$                         d | _        | j1                  | j                         | j3                  |       | j5                  |       | j7                          | j9                          | j;                  |	       |
r| j=                  |
       | j?                          | jA                          | j                  r*| jC                  | j                  jE                                y y )	Nmodelerr   r   r   r   r   subkeyr   r   r   r   F)#r  r+   rR   r   r   r   Getr   r   propWinr   rq   isValidisParameterizedr/   r   DividedShapeShapeRegionregionLabelSetFormatModeFORMAT_CENTRE_HORIZFORMAT_CENTRE_VERT	AddRegionregionComment	SetCanvasSetXSetY_setPen	_setBrushr`   
SetCommentSetRegionSizesReformatRegionsr   r   )r)   rR   r   r   r   r   r   r   r   r   r   s              r*   r+   zModelAction.__init__  s    	T2u-	 $$X6GE !%%X6HF 333<DI 	 	F	$;;  "%%dE6:"0D**''#*@*@@ NN4++,!%DNN4;;'IIaLIIaLLLNNNMM% (!  "99MM$))//12 r,   c                    |rt        j                  ddd      }nb| j                  st        j                  ddd      }n=| j                  rt        j                  ddd      }nt        j                  ddd      }t	        j
                  |d	   |d
   |d         }| j                  t	        j                  |             y)	Set brushr  r   )colorrunningr  r   r  r  validr  invalidr   r]   rv   N)r   r  r  r  rM   ColourSetBrushBrushr)   r  r  wxColors       r*   r  zModelAction._setBrush3  s     $$X6JE  $$9*WUE\\ $$X6HE !$$X6JE ))E!HeAha9bhhw'(r,   c                 h   | j                   r"t        t        j                  ddd            }n!t        t        j                  ddd            }| j                  rt
        j                  }nt
        j                  }t        j                  t
        j                  ||      }| j                  |       y)Set penr  r   r   r  r  r   r  N)r  intr   r  r  rM   SOLIDDOTPenBLACKSetPen)r)   r   r9  pens       r*   r  zModelAction._setPenG  s      #:TE   #:NE
 >>HHEFFEffRXXue,Cr,   c                     d}| j                   j                         }t        j                  |      }| j	                         D ]*  }|j                         }| j                  |||       |dz  }, y )Nr   r]   )rR   r/   rM   rN   
GetRegionsGetText
FormatText)r)   rnumr(   rY   r{  r   s         r*   r  zModelAction.ReformatRegions]  sb    &&([[ oo' 	F>>#DOOBd+AID	r,   c                     t         j                  j                  | |||||       | j                          | j	                          | j                         j                          y rH   )r   r  OnSizingEndDragLeftr  r  r/   Refresh)r)   ptr   r   r   attchs         r*   r  zModelAction.OnSizingEndDragLefth  sK    ,,T2q!T5I  "r,   c                 N   |r|| _         n9| j                   r| j                   }n 	 | j                  j                  d      d   }| j	                         }| j
                  j                  d||fz         | j                          | j                          y#  t        d      }Y `xY w)LSet label

        :param label: if None use command string instead
        TignoreErrorsr   unknown(%d) %sN)	r   r   get_cmdr!   r9   r  SetTextr  r  r)   r   ra   s      r*   r`   zModelAction.SetLabeln  s    
 DJZZJJE%		))t)<Q? jjl  c5\!9:%)s   B B$c                    || _         | j                  t        j                         | _        | j                  j	                  t        j
                         t        j                  j                  t        j                        }|j                  t        j                         | j                  j                  |       | j                  j                  |       | j                          | j                  | j                          | j                   j#                  dd       | j                   r7| j                  | j                         | j                   j#                  dd       | j%                          | j'                          y)zSet commentNg        g      ?g?)r   r  r   r  r  r  rM   SystemSettingsGetFontSYS_DEFAULT_GUI_FONTSetStyleITALICSetFontr  ClearRegionsr  r  SetProportionsr  r  )r)   r   fonts      r*   r  zModelAction.SetComment  s   %!$!2D,,S-D-DE$$,,R-D-DEDMM"))$&&t, 	""7+t''(''S1<<NN4--.++C5r,   c                     | j                   S )zGet comment)r   r.   s    r*   
GetCommentzModelAction.GetComment      ||r,   c                 b    |d   | j                   _        |d   | j                   _        || _        y)zRecord properties dialogrm   ry  N)r   rm   ry  r  )r)   rm   propwins      r*   SetPropertieszModelAction.SetProperties  s)    !(+		 /		r,   c                     | j                   S Get properties dialogr  r.   s    r*   GetPropDialogzModelAction.GetPropDialog  r  r,   c                    | j                   j                  ddd      }|rQg }d|v r/|d   d   D ]#  }|j                  |j                  dd             % n| j                  j                         }t        |t        d      D ]  }t        j                  d	|z         }d}|rkd|v rg|d   d   D ]\  }||j                  dd      k(  s|j                  d
d      dk(  r|j                  dd      }nt        |j                  dd            } n |s||   j                  dd      }|st        t        |            D ]3  }	|j                  ||	         r|j                  |||	         ||	<   |	dz  }	5  |r|ydj                  |      S |S )zGet logging info

        :param string: True to get cmd as a string otherwise a list
        :param substitute: dictionary of parameter to substitute or None
        TF)r  ignoreRequiredignoreDefaultr&   rm   r   r  )r   reverser   r  r   r   r]   rC  )r   r  r3   r  rR   rn   sortedrC   r   r   r  r^   r   r  r   )
r)   r   r&  r   r&   r  r  r   r   ra   s
             r*   r   zModelAction.GetLog  s    iid%   

 Ij(#K0: 8A$$QUU62%678 !KK446	 #9#tD **S8^4+";'4X> "#quuVR'88 uuVX6(B()gr(:(+AEE'2,>(?!" %h/33GR@E S? C~~c#h/#*;;uc#h#?C1HC%. {xx}$
r,   c                     | j                   r| j                   S | j                  j                  d      }|rt        |      dkD  r|d   S t	        d      S )Get nameTr  r   r  )r   r   r  rC   r!   r)   r   s     r*   r   zModelAction.GetLabel  sJ    ::::iiT23s8a<q6M|r,   c                     |r-t        j                  | j                  j                               S | j                  j                         S )zGet dictionary of parameters)r-  r.  r   r   )r)   r%  s     r*   r  zModelAction.GetParams  s4    ==!6!6!899yy$$&&r,   c                     | j                   S )zGet grassTask instancer   r.   s    r*   r   zModelAction.GetTask  s    yyr,   c                 T    |d   | j                   _        |d   | j                   _        y)zSet dictionary of parametersrm   ry  N)r   rm   ry  rl   s     r*   r0  zModelAction.SetParams  s"    !(+		 /		r,   c                     d|v r9|d   D ]1  }| j                   j                  |d   |j                  dd             3 d|v r:|d   D ]1  }| j                   j                  |d   |j                  dd             3 yy)zMerge dictionary of parametersry  r   r   Frm   r  N)r   set_flagr  	set_param)r)   rm   r  r  s       r*   r+  zModelAction.MergeParams  s    fG_ E		""1V9aeeGU.CDEvH% C		##AfIquuWb/ABC r,   c                    d| _         |d   D ]  }|j                  dd      sd| _         n |d   D ]x  }| j                   rC|j                  dd      r1|j                  dd      dk(  r|j                  d	d      dk(  rd| _         | j                  r_|j                  dd      srd| _        z | j                  j	                         r!| j                          | j                          y
y
)zbSet validity for action

        :param options: dictionary with flags and params (gtask)
        Try  r  Frm   r  r   r  r  N)r  r  r  rR   r/   r  r  )r)   optionsr  r  s       r*   r   zModelAction.SetValid  s    
 ! 	Auu_e,'+$	
 " 		,AEE*e,EE'2&",EE)R(B.$''AEE/5,I'+$		, ;;  "NNLLN #r,   c                     | j                   S )z,Check validity (all required parameters set))r  r.   s    r*   r   zModelAction.IsValid  r  r,   c                     | j                   S )z Check if action is parameterized)r  r.   s    r*   rw  zModelAction.IsParameterized   s    ###r,   c                     g g d}| j                         }|d   D ])  }|j                  dd      s|d   j                  |       + |d   D ])  }|j                  dd      s|d   j                  |       + |S )z&Return parameterized flags and options)ry  rm   ry  r  Frm   )r  r  r3   )r)   r   r  r  r  s        r*   GetParameterizedParamsz"ModelAction.GetParameterizedParams$  s    +.."! 	)Auu_e,g%%a(	) " 	*Auu_e,h&&q)	* r,   c                     | j                         D ]<  }|j                         }||j                         k(  s'||j                         v s:|c S  y)zFind data item by nameN)rw   rx   r   )r)   r   r   rq   s       r*   r   zModelAction.FindData4  sJ    $$& 	C;;=Ds||~%$$--/*A	
 r,   c                 n    |r| j                  d       n| j                          | j                          y)Update actionT)r  N)r  r  )r)   r  s     r*   r   zModelAction.Update=  s&    NN4N(NNr,   c                     | j                          | j                          t        j                  j	                  | |       t        j                  j                  | |       y)zDraw action in canvasN)r  r  r   RectangleShapeRecentreOnDrawr)   rY   s     r*   r(  zModelAction.OnDrawE  sA    ##D"-!!$+r,   )rf   NNNNNr  r  rH   )TN)r  r  r  r  r+   r  r  r  r  r`   r  r  r  r  r   r   r  r   r0  r+  r   r   rw  r!  r   r   r(  r   r,   r*   rD   rD     s    % C3J)(,	#(41f	'*
C6$ ,r,   rD   c                       e Zd ZddZd Zd Zd Zd Zd ZddZ	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)ry   Nc                 <   t         j                  |        || _        || _        || _        d| _        d| _        d| _        |st        j                  ddd      }|st        j                  ddd      }| j                  j                         rt        j                  j                  | ||       | j                  | j                         | j                  |       | j                  |       | j!                          | j#                          | j%                          yy)a$  Data item class

        :param parent: window parent
        :param x, y: position of the shape
        :param fname, tname: list of parameter names from / to
        :param value: value
        :param prompt: type of GIS element
        :param width, height: dimension of the shape
        FNr  rq   r  r  r  )r  r+   rR   r   r   r   r   r  r   r  r/   r   EllipseShaper  r  r  r  r  r`   )r)   rR   r   r   r   r   r   r   s           r*   r+   zModelData.__init__N  s     	T"
! $$V4EE !%%V4FF ;;  "%%dE6:NN4;;'IIaLIIaLLLNNNMMO #r,   c                     | j                   S )z#Checks if data item is intermediater   r.   s    r*   rt  zModelData.IsIntermediates  s       r,   c                     || _         y)zSet intermediate flagNr.  )r)   ims     r*   r   zModelData.SetIntermediatew  s
    r,   c                     | j                   S )z-Checks if data item is marked to be displayedr   r.   s    r*   
HasDisplayzModelData.HasDisplay{  r  r,   c                     || _         y)zSet to-be-displayed flagNr2  )r)   tbds     r*   r   zModelData.SetHasDisplay  	    r,   c                 d    | j                          t        j                  j                  | |       y rH   )r  r   r,  r(  r)  s     r*   r(  zModelData.OnDraw  s!    b)r,   c                 (   t               }| j                         D ]!  }|j                  |j                                # |r4dj	                  |      dz   | j
                  z   dz   | j                  z   dz   S | j
                  dz   | j                  z   dz   S )zGet logging info/r   r;  r<  )r   rw   r3   r   r   r   r   )r)   r   r   r   s       r*   r   zModelData.GetLog  s    v$$& 	(CKK'	(88D>C'$**4t;dkkICOO::$t{{2S88r,   c                     t               }| j                         D ]!  }|j                  |j                                # |S )zGet list of names)r   rw   r3   r   r)   r   r   s      r*   r   zModelData.GetLabel  s:    v$$& 	(CKK'	( r,   c                     | j                   S )z
Get promptr   r.   s    r*   r   zModelData.GetPrompt  r0   r,   c                     || _         y)z+Set prompt

        :param prompt:
        Nr=  )r)   r   s     r*   	SetPromptzModelData.SetPrompt  s    
 r,   c                     | j                   S )z	Get value)r   r.   s    r*   r   zModelData.GetValue  r  r,   c                    || _         | j                          dD ]  }| j                  |      D ]  }|dk(  r|j                         }n|j	                         }t        d      j                  |j                  d            }|j                  |j                         | j                          |j                  |j                                  y)z)Set value

        :param value:
        r   tor   Nr   Fr   r   )r   r`   rw   r{   rz   r   r   r   r  r   r+  r   )r)   r   	directionr   r   r   s         r*   SetValuezModelData.SetValue  s    
 
' 		7I((3 7& YY[F [[]F~22v}}E}7R2Ss||~tzz:""4#3#3#567		7r,   c                     | j                   S r
  r  r.   s    r*   r  zModelData.GetPropDialog  r  r,   c                     || _         y)r  Nr  )r)   r   s     r*   SetPropDialogzModelData.SetPropDialog  r6  r,   c                    | j                   dk(  rt        j                  ddd      }n| j                   dk(  rt        j                  ddd      }nh| j                   dk(  rt        j                  ddd	      }n@| j                   d
k(  rt        j                  ddd      }nt        j                  ddd      }t        j                  |d   |d   |d         }| j                  t        j                  |             y)r  rp  r  rq   )r  rp  r  rr  )r  raster3drq  )r  rq  dbtable)r  rK  r   r  r   r]   rv   N)r   r   r  rM   r  r  r  r)   r  r  s      r*   r  zModelData._setBrush  s    ;;(" $$V4GE [[K' $$V4IE [[H$ $$V4GE [[I% $$V4HE !$$X6JE ))E!HeAha9bhhw'(r,   c                 <   d}| j                  d      D ]$  }|j                         j                         s"d} n |s8| j                  d      D ]$  }|j                         j                         s"d} n |r"t	        t        j                  ddd            }n!t	        t        j                  ddd	            }| j                  rt        j                  }nt        j                  }t        j                  t        j                  ||      }| j                  |       y
)r  Fr   TrC  r  r   r  r  r  N)rw   r{   rw  rz   r  r   r  r   rM   r  r  r  r  r  )r)   r  r   r   r9  r  s         r*   r  zModelData._setPen  s    $$V, 	Cyy{**,"&	 ((. ;;=002&*O
   #:TE   #:NE
 FFEHHEffRXXue,Cr,   c                 T   | j                          g }| j                         D ]!  }|j                  |j                                # | j	                  dj                  |             | j                  r| j	                  | j                         y| j	                  t        d             y)zUpdate textr9  z<not defined>N)	ClearTextrw   r3   r   AddTextr   r   r!   r;  s      r*   r`   zModelData.SetLabel  sw    $$& 	(CKK'	(SXXd^$::LL$LL?+,r,   c                 d    | j                          | j                          | j                          y)r$  N)r  r  r`   r.   s    r*   r   zModelData.Update	  s    r,   c                    g }| j                   dk(  r|j                  d       nE| j                   dk(  r|j                  d       n$t        dj                  | j                               |j                  d| j                  z          |S )zGet display command as listrp  zd.rastrq  zd.vectzUnsupported display prompt: {}zmap=)r   r3   r	   r   r   r  s     r*   GetDisplayCmdzModelData.GetDisplayCmd  sl    ;;("JJx [[H$JJx =DDT[[QRR

6DJJ&'
r,   )r  r  NNr  )r  r  r  r+   rt  r   r3  r   r(  r   r   r   r?  r   rE  r  rH  r  r  r`   r   rS  r   r,   r*   ry   ry   M  sc    #J!*
97$)2B
-r,   ry   c                   \    e Zd ZdZddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZddZd Zd Zy)r   zData - action relationc                     || _         || _        || _        || _        d | _        | j                  j                         r t        j                  j                  |        y y rH   )	r   r   r   rR   _pointsr/   r   	LineShaper+   )r)   rR   r   r   r   s        r*   r+   zModelRelation.__init__!  sL    "
;;  "MM""4( #r,   c                     | | j                   j                  v r%| j                   j                  j                  |        | | j                  j                  v r&| j                  j                  j                  |        y y rH   )r   r   r}   r   r.   s    r*   r  zModelRelation.__del__,  s[    4>>&&&NN&&t,4<<$$$LL$$T* %r,   c                     | j                   S )zGet id of 'from' shape)r   r.   s    r*   rz   zModelRelation.GetFrom2  r  r,   c                     | j                   S )zGet id of 'to' shape)r   r.   s    r*   r{   zModelRelation.GetTo6  r  r,   c                     t        | j                  t              r| j                  S t        | j                  t              r| j                  S y)zoGet related ModelData instance

        :return: ModelData instance
        :return: None if not found
        N)r2   r   ry   r   r.   s    r*   rx   zModelRelation.GetData:  s7     dnni0>>!i0<<r,   c                     | j                   S )zGet parameter namer   r.   s    r*   r   zModelRelation.GetLabelG  r  r,   c                     | j                   j                          | j                  j                          | j                          y)zReset related objectsN)r   ResetControlPointsr   r.   s    r*   ResetShapeszModelRelation.ResetShapesK  s.    ))+'')!r,   c                     || _         y)zSet control pointsNrV  )r)   r   s     r*   r   zModelRelation.SetControlPointsQ  s	    r,   c                     | j                   S )zGet list of control pointsrb  r.   s    r*   GetControlPointszModelRelation.GetControlPointsU  r  r,   c                     | j                  t        j                  t               r|st        j                  nt        j
                  dt        j                               yr  r]   N)r  rM   r  r   WHITEr  r  )r)   bg_whites     r*   r  zModelRelation._setPenY  s2    FFvx288bhh288T	
r,   c                     | j                  |j                         t        j                  k(         t        j
                  j                  | |       y)zDraw relationN)r  GetBackgroundrM   WHITE_BRUSHr   rW  r(  r)  s     r*   r(  zModelRelation.OnDraw_  s4    R%%'2>>9:T2&r,   c                     || _         y rH   r]  )r)   r   s     r*   SetNamezModelRelation.SetNamed  s	    
r,   Nr  r  )r  r  r  r  r+   r  rz   r{   rx   r   r`  r   rd  r  r(  rm  r   r,   r*   r   r     sA     	)+"
'
r,   r   c                   D    e Zd Zddddg fdZd Zd ZddZd Zd	 Zd
 Z	y)	ModelItemrf   Nr  c	                 @    t         j                  | ||       || _        y)z'Abstract class for loops and conditionsN)r  r+   rR   )	r)   rR   r   r   r   r   r   r   r    s	            r*   r+   zModelItem.__init__i  s     	T2u-r,   c                     | j                   rt        j                  }nt        j                  }t        j                  t        j
                  d|      }| j                  |       yrf  )r  rM   r  r  r  r  r  )r)   r9  r  s      r*   r  zModelItem._setPenp  s=    >>HHEFFEffRXXq%(Cr,   c                     || _         y)zSet loop idNr  )r)   r   s     r*   r_   zModelItem.SetIdz  s	    r,   c                     |r|| _         | j                          | j                  dt        | j                        z   dz   | j                   z          y)zSet loop text (condition)() N)r   rO  rP  r  r   r  s     r*   r`   zModelItem.SetLabel~  s=    DJS3tww<'$.;<r,   c                 `    | j                   rt        d      | j                   z   S t        d      S )zGet log infozCondition: zCondition: not defined)r   r!   r.   s    r*   r   zModelItem.GetLog  s)    ::]#djj00-..r,   c                 :    | j                   j                  |       y)zRecord relationNr  r  s     r*   r   zModelItem.AddRelation  r  r,   c                 "    t               | _        y)zClear object, remove relsN)r   r   r.   s    r*   ClearzModelItem.Clear  s    F	r,   r  )
r  r  r  r+   r  r_   r`   r   r   ry  r   r,   r*   ro  ro  h  s0    !d"B=/r,   ro  c                   L    e Zd Zdddddg fdZd ZddZd Zd Zd	 Zd
 Z	d Z
y)rQ   rf   Nr  c
                 :   t         j                  | ||||||||		       t               | _        |st	        j
                  ddd      }|st	        j
                  ddd      }| j                  j                         rt        j                  j                  | ||       | j                  | j                         | j                  |       | j                  |       | j                          | j                          | j                  d       | j!                  |       yy)zDefines a loopr  r   r  r  r  d   N)ro  r+   r   itemIdsr   r  rR   r/   r   r&  r  r  r  r  r  SetCornerRadiusr`   )
r)   rR   r   r   r   ra   r   r   r   r    s
             r*   r+   zModelLoop.__init__  s     	4Ar5&%Ov $$V4EE !%%V4FF ;;  "''eV<NN4;;'IIaLIIaLLLNNN  %MM%  #r,   c                    | j                   st        j                  ddd      }nt        j                  ddd      }t        j                  |d   |d   |d	         }| j                  t        j                  |             y
)r  r  r   r  r  r   r  r   r]   rv   N)r  r   r  rM   r  r  r  rL  s      r*   r  zModelLoop._setBrush  sj    ~~ $$9*WUE $$V4FE ))E!HeAha9bhhw'(r,   c                     | j                   D ]1  }| j                  j                  |      }|s!|j                  |       3 t        j                  | |       | j                          yr  )r}  rR   r   r   r  r   )r)   r  ra   r6   s       r*   r   zModelLoop.Enable  sS    << 	%C;;))#.DG$	%
 	4)r,   c                 D    | j                          | j                          y rH   )r  r  r.   s    r*   r   zModelLoop.Update  s    r,   c                     t               }|D ]0  }|j                         | j                  v s |j                  |       2 |S )Get sorted items by id)r   r9   r}  r3   r)   r    r5   r6   s       r*   r7   zModelLoop.GetItems  s=     	$Dzz|t||+d#	$ r,   c                     || _         y)zSet items (id)Nr}  )r)   r    s     r*   r   zModelLoop.SetItems  s	    r,   c                 d    | j                   j                  |      }|dk7  r|| j                   |<   yy)zUpdate item in the listrf   N)r}  r>   )r)   oldIdr  ra   s       r*   r  zModelLoop.UpdateItem  s0    ll  '"9 %DLL r,   c                     | j                          t        j                  j                  | |       t        j                  j	                  | |       y)zDraw loop in canvasN)r  r   r&  r'  r(  r)  s     r*   r(  zModelLoop.OnDraw  s8    ##D"-!!$+r,   r  )r  r  r  r+   r  r   r   r7   r   r  r(  r   r,   r*   rQ   rQ     s8    !rd"TV!6
)&,r,   rQ   c                   D    e Zd Zddddg g dfdZd Zd Zd Zd	 Zdd
Zy)rT   rf   Nr  ifelsec	                 z   t         j                  | ||||||||	       g g d| _        |st        j                  ddd      | _        n|| _        |st        j                  ddd      | _        n|| _        | j                  j                         r+t        j                  j                  |        d| j                   dz  f| j
                  dz  dfd| j                  dz  f| j
                   dz  dfg}	| j                  |	       | j                  | j                         | j                  |       | j                  |       | j                  t         j"                         |r.| j%                  d	t'        | j(                        z   d
z   |z          y| j%                  d	t'        | j(                        z   dz          yy)zDefines a if-else conditionr  r  if-elser  r  r  r   rv   rt  ru  r<  N)ro  r+   r}  r   r  r   r   rR   r/   r   PolygonShapeCreater  r  r  r  rM   	BLACK_PENrP  r  r   )
r)   rR   r   r   r   r   r   r   r    r   s
             r*   r+   zModelCondition.__init__  sy    	4Ar5&%O "-%))Y7HDJ DJ&**Y7IDK !DK;;  "%%d+ T[[L1$%a#DKK!O$**q!$	F KKNN4;;'IIaLIIaLKK%S3tww</$6>?S3tww</#56% #r,   c                     t        d      S )r  r  )r!   r.   s    r*   r   zModelCondition.GetLabel  s    |r,   c                     | j                   S )zGet object width)r   r.   s    r*   GetWidthzModelCondition.GetWidth  r  r,   c                     | j                   S )zGet object height)r   r.   s    r*   	GetHeightzModelCondition.GetHeight  r0   r,   c                     g g d}|D ]j  }|j                         | j                  d   v r|d   j                  |       7|j                         | j                  d   v sW|d   j                  |       l |S )r  r  r  r  )r9   r}  r3   r  s       r*   r7   zModelCondition.GetItems"  st    B' 	,Dzz|t||D11t##D)f!55v%%d+		, r,   c                 ,    |dv r|| j                   |<   yy)zaSet items (id)

        :param items: list of items
        :param branch: 'if' / 'else'
        r  Nr  )r)   r    r   s      r*   r   zModelCondition.SetItems-  s     ^##(DLL  $r,   )r  )	r  r  r  r+   r   r  r  r7   r   r   r,   r*   rT   rT     s7     $.7`	)r,   rT   c                   6    e Zd ZddZd	dZd Zd
dZd Zd Zy)r   Nc                    t         j                  | ||       |st        j                  ddd      }|st        j                  ddd      }|j	                         rt
        j                  j                  | ||       | j                  |       | j                  |       | j                  |       t        j                  j                  t        j                        }|j                  t        j                         | j!                  |       | j#                          | j%                          | j'                  |       yy)zDefines a model commentr  r   r  r  r  N)r  r+   r   r  r/   r   r&  r  r  r  rM   r  r  r  r  r  r  r  r  r`   )	r)   rR   r   r   r   r   r   r   r  s	            r*   r+   zModelComment.__init__8  s    T2u- $$Y7HE !%%Y7IF ''eV<NN6"IIaLIIaL$$,,R-D-DEDMM"))$LLLLNNNMM%  r,   c                     t        j                  ddd      }t        j                  |d   |d   |d         }| j	                  t        j
                  |             y)	r  r  r   r  r  r   r]   rv   N)r   r  rM   r  r  r  r  s       r*   r  zModelComment._setBrushQ  sI      yiP))E!HeAha9bhhw'(r,   c                     t        j                  t         j                  dt         j                        }| j	                  |       yrf  )rM   r  r  r  r  )r)   r  s     r*   r  zModelComment._setPenW  s(    ffRXXq"&&)Cr,   c                     |r|| _         n| j                   r| j                   }nd}| j                         }| j                          | j                  d||fz         y)r  r  r  N)r   r9   rO  rP  r  s      r*   r`   zModelComment.SetLabel\  sM    
 DJZZJJEEjjlY#u-.r,   c                 "    | j                         S rH   )r   r.   s    r*   r  zModelComment.GetCommentl  s    }}r,   c                 b    | j                  |       | j                         j                          y rH   )r`   r/   r  r)   r   s     r*   r  zModelComment.SetCommento  s!    g  "r,   )rf   NNr  r  rH   )	r  r  r  r+   r  r  r`   r  r  r   r,   r*   r   r   7  s     !2)
/ #r,   r   c                   r    e Zd ZdZd Zd ZddZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zy)r   zProcess GRASS model file (gxm)c                    || _         | j                   j                         | _        | j                  | j                  j                  dk7  rQ| j                  | j                  j                  }nt	        d      }t        t	        d      j                              t               | _        t               | _	        t               | _        t               | _        t               | _        t               | _        t               | _        | j!                          | j#                          | j%                          | j'                          | j)                          y)zYA ElementTree handler for the GXM XML file, as defined in
        grass-gxm.dtd.
        Ngxmemptyz$Details: unsupported tag name '{0}'.)treegetrootroottagr!   r	   r   r%   r$   r&   r   r   rq   r   r   r   _processWindow_processProperties_processVariables_processItems_processData)r)   r  tagNametabNames       r*   r+   zProcessModelFile.__init__w  s     	II%%'	99		 6yy$))--G*QEFMMgVWW &vF	V
&! r,   c                 N    |j                  dd      }|j                  dd      }|S )z,Filter value

        :param value:
        z&lt;<z&gt;>)replacer)   r   s     r*   _filterValuezProcessModelFile._filterValue  s)    
 fc*fc*r,   c                     |j                  |      }|,|j                  rt        j                  |j                        S y|S )zGet node textr  )findr   r   normalize_whitespace)r)   noder  r  r  s        r*   _getNodeTextzProcessModelFile._getNodeText  s8    IIcN=vv11!&&99r,   c                     | j                   j                  d      }|dx| _        | _        y| j	                  |      \  | _        | _        y)zProcess window propertieswindowN)r  r  r   r   _getDim)r)   r  s     r*   r  zProcessModelFile._processWindow  sA    yy~~h'<#''DHty"ll40$)r,   c                     | j                   j                  d      }|ydD ]  }| j                  ||        |j                  d      D ])  }|j	                  dd      }|dk(  sd| j
                  d<   + y)	zProcess model propertiesr$   Nr   flagr   r  	overwriteT)r  r  _processPropertyfindallr  r$   )r)   r  r   r  r   s        r*   r  z#ProcessModelFile._processProperties  s{    yy~~l+<4 	-C!!$,	- f% 	4A55$D{"/3,	4r,   c                 |    |j                  |      }||j                  | j                  |<   yd| j                  |<   y)zProcess given propertyNr  )r  r   r$   )r)   pnoder   r  s       r*   r  z!ProcessModelFile._processProperty  s6    zz$$(IIDOOD!$&DOOD!r,   c                    | j                   j                  d      }|y|j                  d      D ]R  }|j                  dd      }|sd|j                  dd      i| j                  |<   dD ]  }| j                  |||        T y)	zProcess model variablesr&   Nr  r   r  r  r   )r   r   )r  r  r  r  r&   _processVariable)r)   vnoder  r   r   s        r*   r  z"ProcessModelFile._processVariables  s    		{+=MM*- 	7D88FB'D$*DHHVX,F#GDNN4 / 7%%dD#67	7r,   c                 ~    |j                  |      }|*|j                  r|j                  | j                  |   |<   yyy)zProcess given variableN)r  r   r&   )r)   r  r   r   r  s        r*   r  z!ProcessModelFile._processVariable  s=    zz#yy,0IIt$S)  r,   c                     | j                          | j                          | j                          | j                          y)z0Process model items (actions, loops, conditions)N)_processActions_processLoops_processConditions_processCommentsr.   s    r*   r  zProcessModelFile._processItems  s2    !r,   c                    | j                   j                  d      D ]  }| j                  |      \  }}d}|j                  d      }|%|j                  d      d}| j	                  |      }nd}t        |j                  dd            }|j                  d	      }|j                  d
      }||j                  }	nd}	| j                  j                  |||||||	d        y)Process model filer   Fr   Nr   Tr   rf   r   r   r  )r   r   r   r   r   r   r   )
r  r  r  r  _processTaskr  r  r   r   r3   )
r)   r   r   r   r   r   r:   r   r   commentStrings
             r*   r  z ProcessModelFile._processActions  s    ii''1 	FV,ICH;;v&D99Z(4#H((.fjjr*+CJJv&Ekk),G" ' "LL   (",
)	r,   c                 `   dx}}|j                  dd      }|r3t        t        t        |j	                  d                  }	 |d   |d   f}|j                  dd      }|r7t        t        t        |j	                  d                  }	 |d   |d   f}||fS ||fS #  d}Y UxY w#  d}Y ||fS xY w)zGet position and size of shapeNr   ri  r   r]   r   )r  r   r   r  r   )r)   r  r   r   posAttrposValsizeAttrsizeVals           r*   r  zProcessModelFile._getDim  s    d((5$'#c7==#567Fay&), 88FD)3sHNN3$789G
GAJ/ DysDyDys   
B 	
B$ B!$B-c                    | j                   j                  d      D ]  }| j                  |      \  }}|j                  d      }dx}}|3|j	                  dd      }| j                  | j                  |d            }|j                  d      dnd}|j                  d	      dnd}t               }	|j                  d
      D ]  }
t        |
j	                  dd            |
j	                  dd      |
j	                  dd      d}t               }|
j                  d      D ]i  }| j                  | j                  |d            }| j                  | j                  |d            }|j                  t        |      t        |      f       k ||d<   |	j                  |        | j                  j                  |||||||	d        y)r  rq   zdata-parameterNr   r   r   FTr   r   r   rf   r   rC  r   r  )r   r   r   pointr   r   r   )r   r   r   r   r   r   r   )r  r  r  r  r  r  r  r   r  r3   floatrq   )r)   rq   r   r   r   r   r   r   r   r   r   defrelr   r  r   r   s                   r*   r  zProcessModelFile._processData  s   II%%f- %	DT*ICII./E!!FU 8T2))$*;*;E7*KL$(IIn$=$E54L#yy3;eG6D||J/ $cggdB/0775$/GGFB/
  [[1 8E))$*;*;E3*GHA))$*;*;E3*GHAMM58U1X"678 $*x F#$ II $"$0& 
7%	r,   c                    t               }t               }|j                  dd      }|sy|j                  |       |j                  d      D ]  }|j                  dd      }|j                  dd      dk(  r)|j                  d|f       |j                  dd      dk(  rSt	        |      d	kD  r|j                  d
|z          v|j                  d|z           |j                  d      D ]m  }|j                  dd      }|j                  d      |j                  d|f       |j                  |d| j                  | j                  |d                   o t        dd      j                  |      \  }}	|	r(t        t        j                  j                  |	             |D ]3  \  }
}|
dk(  r|j                  |dd        |j                  |dd       5 |S )zYProcess task

        :return: grassTask instance
        :return: None on error
        r   Nr  r  r  01r   r]   z---	parameterr   r   T)r   
checkErrorr   )r  )r   r  r3   r  rC   r  r  r  r   r   r   r   linesepr   r  r  )r)   r  r   r  r   r  r  r  r   r_  r   s              r*   r  zProcessModelFile._processTaskB  s    fxx%

4 f% 		'A55$Duu_c*c1$$fd^455#&#-4y1}

4$;'

3:&		' k* 	A55$Dvvo&2$$gt_5JJ!2!243D3DQ3P!QR		 Td3@@S@I	cRZZ__S)*& 	DICf}dD/BtT?C		D r,   c                    | j                   j                  d      D ]  }| j                  |      \  }}| j                  | j	                  |d            j                         }t               }|j                  d      D ]'  }	 |j                  t        |j                               ) | j                  j                  |||t        |j                  dd            |d        y# t        $ r Y rw xY w)zProcess model loopsr   r   r6   r   rf   r   r   r   r   r    N)r  r  r  r  r  r   r   r3   r  r   
ValueErrorr   r  )r)   r  r   r   r   aidanodes          r*   r  zProcessModelFile._processLoopsq  s    II%%f- 	DT*IC$$T%6%6t[%IJPPRD&Cf- JJs5::/ JJ  dhhtR01 	 " s   $C$$	C0/C0c                 T   | j                   j                  d      D ]  }| j                  |      \  }}| j                  | j	                  |d            j                         }t               t               d}|j                         D ]T  }|j                  |      }||j                  d      D ]*  }	 ||   j                  t        |j                               , V | j                  j                  |||t        |j                  dd            |d        y# t        $ r Y ww xY w)	zProcess model conditionsr  r   r  Nr6   r   rf   r  )r  r  r  r  r  r   r   r   r  r3   r  r   r  r   r  )	r)   r  r   r   r   r  r   bnoder  s	            r*   r  z#ProcessModelFile._processConditions  s   II%%i0 	DT*IC$$T%6%6t[%IJPPRD0CXXZ 		!="]]62 EAc%**o6	 OO""  dhhtR01 	 & s   3'D	D'	&D'	c                    | j                   j                  d      D ]k  }| j                  |      \  }}| j                  |j                        }| j
                  j                  |||t        |j                  dd            |d       m y)zProcess model commentsr   r   rf   )r   r   r   r   r   N)	r  r  r  r  r   r   r3   r  r  )r)   r  r   r   r   s        r*   r  z!ProcessModelFile._processComments  s|    II%%i0 	DT*IC$$TYY/DMM    dhhtR01 		r,   Nr  )r  r  r  r  r+   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r,   r*   r   r   t  sX    (:	14'76  D*'R-^,4r,   r   c                   ^    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zy)WriteModelFilez$Generic class for writing model filec                 N   || _         || _        |j                         | _        |j	                         | _        |j                         | _        d| _        | j                          | j                          | j                          | j                          | j                          t               }|j                  t              D ]=  }|j!                         D ](  }|j#                         }||vs|j%                  |       * ? | j'                  |       | j)                          y )Nr   rB   )r  r   rj   r$   rn   r&   r7   r    indent_header_window_properties
_variables_itemsr   rD   rw   rx   r3   _data_footer)r)   r  r   dataListr   r   r   s          r*   r+   zWriteModelFile.__init__  s    
--/++-^^%
6nn[n9 	.F**, .;;=8+OOH-.	.
 	

8r,   c                 0    t        j                  |      }|S )zEscapes value to be stored in XML.

        :param value: string to be escaped as XML
        :return: a XML-valid string
        )saxutilsescaper  s     r*   r  zWriteModelFile._filterValue  s     &r,   c                 
   | j                   j                  dt        d      z         | j                   j                  d       | j                   j                  dd| j                  z  z         | xj                  dz  c_        y)	zWrite headerz$<?xml version="1.0" encoding="%s"?>
T)	forceUTF8z&<!DOCTYPE gxm SYSTEM "grass-gxm.dtd">
z%s<gxm>
rC     N)r  r  r   r  r.   s    r*   r  zWriteModelFile._header  s`    36HSW6XX	
 	?@kS4;;%678qr,   c                     | xj                   dz  c_         | j                  j                  dd| j                   z  z         y)zWrite footerr  z	%s</gxm>
rC  N)r  r  r  r.   s    r*   r  zWriteModelFile._footer  s.    qlcDKK&789r,   c           	         | j                   j                         }|y|j                  }|j                         }|j	                         }| j
                  j                  dd| j                  z  |d   |d   |d   |d   fz         y)zWrite window propertiesNz&%s<window pos="%d,%d" size="%d,%d" />
rC  r   r]   )r   r/   rR   GetPositionGetSizer  r  r  )r)   r(   r   r   r   s        r*   r  zWriteModelFile._window  s|    %%'>mmoo{{}5T[[ #a&#a&$q'47CD	
r,   c                 P   | j                   j                  dd| j                  z  z         | xj                  dz  c_        | j                  d   r;| j                   j                  d| j                  z  d| j                  d   d       | j                  d   r;| j                   j                  d| j                  z  d| j                  d   d	       | j                  d
   r;| j                   j                  d| j                  z  d| j                  d
   d       d| j                  v r:| j                  d   r+| j                   j                  dd| j                  z  z         | xj                  dz  c_        | j                   j                  dd| j                  z  z         y)zWrite model propertiesz%s<properties>
rC  r  r   z<name>z</name>
r   <description></description>
r   z<author>z
</author>
r  z%s<flag name="overwrite" />
z%s</properties>
N)r  r  r  r$   r.   s    r*   r  zWriteModelFile._properties  s@   (C$++,=>?q??6"GGMM),t{{):DOOF<ST ??=)GGMM$doom&DF ??8$GGMM$dooh&?A
 $//)dook.JGGMM9S4;;=NOPq)S4;;->?@r,   c           	      R   | j                   sy| j                  j                  dd| j                  z  z         | xj                  dz  c_        t	        j
                  | j                         D ]  \  }}| j                  j                  d| j                  z  d|d|d   d       | xj                  dz  c_        d	|v r1| j                  j                  d| j                  z  d
|d	   d       d|v r1| j                  j                  d| j                  z  d|d   d       | xj                  dz  c_        | j                  j                  dd| j                  z  z          | xj                  dz  c_        | j                  j                  dd| j                  z  z         y)zWrite model variablesNz%s<variables>
rC  r  z<variable name="z" type="r  ">
r   <value>	</value>
r   r  r  z%s</variable>
z%s</variables>
)r&   r  r  r  rI   rJ   )r)   r   r  s      r*   r  zWriteModelFile._variables	  sR   ~~'3+<=>qMM$..9 	CLD&GGMM$dF6N< KK1K& /2T[[/@&/R &T[[(&*?A KK1KGGMM+sT[[/@AB!	C" 	q(C$++,=>?r,   c                 6   | j                   D ]  }t        |t              r| j                  |       %t        |t              r| j                  |       Gt        |t              r| j                  |       it        |t              sz| j                  |        y)zWrite actions/loops/conditionsN)
r    r2   rD   _actionrQ   _looprT   
_conditionr   _commentr?   s     r*   r  zWriteModelFile._items%	  sm    JJ 	$D$,T"D),

4 D.1%D,/d#	$r,   c                    | j                   j                  dd| j                  z  |j                         |j	                         |j                         |j                         |j                         |j                         fz         | xj                  dz  c_        |j                         }|r.| j                   j                  d| j                  z  d|d       | j                   j                  d| j                  z  d|j                  d      d	   d
       | xj                  dz  c_        |j                         s+| j                   j                  dd| j                  z  z         t        j                  |j                               D ]i  \  }}|dk(  r|D ]
  }|j                  dd      s|j                  dd      s)|j                  dd      r|j                  dd      du r?| j                   j                  d| j                  z  d|j                  dd      d       | j                   j                  d| j                  z  d|j                  dd      d       | j                   j                  d| j                  z  d|j                  dd      d        |D ]E  }|j                  dd      s|j                  dd      s)| j                   j                  d| j                  z  d|j                  dd      d
       | xj                  dz  c_        |j                  dd      r+| j                   j                  dd| j                  z  z         | j                   j                  d| j                  z  d| j!                  |j                  dd            d       | xj                  dz  c_        | j                   j                  dd| j                  z  z         H l | xj                  dz  c_        | j                   j                  dd| j                  z  z         | xj                  dz  c_        | j                   j                  dd| j                  z  z         y)zWrite actionsz6%s<action id="%d" name="%s" pos="%d,%d" size="%d,%d">
rC  r  z	<comment>z</comment>
z<task name="Fr   r   r  z%s<disabled />
ry  r   r  z<flag name="r   r  z!" value="0" parameterized="1" />
z" parameterized="1" />
z" />
z<parameter name="z%s<parameterized />
r  r  z%s</parameter>
z
%s</task>
z%s</action>
N)r  r  r  r9   r   GetXGetYr  r  r  r   rU  rI   rJ   r  r  r  )r)   r   r   r   valr  r  s          r*   r	  zWriteModelFile._action1	  s}   Edkk!!!  "		
 	q##%GGMMt{{9JGTU&)DKK&7e9TUV9WX	
 	q!GGMM,dkk0ABCf&6&6&89 $	LHCg~ AuuWe,ou0M55%8 uuWe4= $'*T[['8!%%:K%M!"
 !%'*T[['8!%%:K%M!"
 !GGMM#&#4aeeFB6G!I&  LA55"-aeeOU6S GGMM,aeeFB.?A KK1$Kuu_e4&=t{{AR&STGGMM,d.?.?gr@R.SU KK1$KGGMM"4dkk8I"JKL+$	LJ 	qmsT[['89:qot{{):;<r,   c                 P   |D ]   }| j                   j                  dd| j                  z  |j                         |j	                         |j                         |j                         fz         | xj                  dz  c_        | j                   j                  d| j                  z  d|j                         d       | xj                  dz  c_        | j                   j                  d| j                  z  d| j                  |j                               d       | xj                  dz  c_        | j                   j                  dd| j                  z  z         |j                         r+| j                   j                  d	d| j                  z  z         |j                         r+| j                   j                  d
d| j                  z  z         dD ]  }|j                  |      D ]  }|dk(  r|j                         j                         }n|j                         j                         }| j                   j                  dd| j                  z  |||j!                         fz         | xj                  dz  c_        |j#                         dd D ]  }| j                   j                  dd| j                  z  z         | xj                  dz  c_        |j%                         \  }}| j                   j                  dd| j                  z  t'        |      fz         | j                   j                  dd| j                  z  t'        |      fz         | xj                  dz  c_        | j                   j                  dd| j                  z  z          | xj                  dz  c_        | j                   j                  dd| j                  z  z           | xj                  dz  c_        | j                   j                  dd| j                  z  z         # y)z
Write dataz"%s<data pos="%d,%d" size="%d,%d">
rC  r  z<data-parameter prompt="r  r  r  z%s</data-parameter>
z%s<intermediate />
z%s<display />
rB  r   z(%s<relation dir="%s" id="%d" name="%s">
r]   rf   z
%s<point>
z%s<x>%d</x>
z%s<y>%d</y>
z%s</point>
z%s</relation>
z
%s</data>
N)r  r  r  r  r  r  r  r   r  r   rt  r3  rw   r{   r9   rz   r   GetLineControlPointsr  r  )	r)   r  rq   ftr   r  r  r   r   s	            r*   r  zWriteModelFile._datas	  s9    5	?DGGMM5$++%IIKIIKMMONN$	 KK1KGGMM$dnn&68 KK1KGGMM$d&7&7&HJ KK1KGGMM1S4;;5FGH""$4dkk8IJK /33DEF % K,,R0 KCV|!iik//1!kkm113GGMMC,b#s||~FG KK1$K!$!9!9!;Ab!A LmsT[[7H&IJq($yy{1ot{{9JCPQF8S&STot{{9JCPQF8S&STq(ndkk8I&JKL KK1$KGGMM"3sT[[7H"IJ'KK, KK1KGGMM-3+<=>k5	?r,   c           
         | j                   j                  dd| j                  z  |j                         |j	                         |j                         |j                         |j                         fz         | xj                  dz  c_        |j                         }|r=| j                   j                  d| j                  z  d| j                  |      d       |j                  | j                  j                  t                    D ]=  }| j                   j                  dd| j                  z  |j                         fz         ? | xj                  dz  c_        | j                   j                  dd| j                  z  z         y	)
zWrite loopsz*%s<loop id="%d" pos="%d,%d" size="%d,%d">
rC  r  <condition></condition>
rB   %s<item>%d</item>
z
%s</loop>
N)r  r  r  r9   r  r  r  r  r   r  r7   r   rD   )r)   r   r`  r6   s       r*   r
  zWriteModelFile._loop	  s)   9dkk!

				 
	
 	q}}GGMM$d&7&7&=? MM$**"5"5k"5"JK 	UDGGMM/33Ddjjl2SST	UqmsT[['89:r,   c           
      2   |j                         }| j                  j                  dd| j                  z  |j	                         |j                         |j                         |d   |d   fz         |j                         }| xj                  dz  c_        |r=| j                  j                  d| j                  z  d| j                  |      d       |j                         }|j                         D ]  }t        ||         dk  r| j                  j                  d| j                  z  d|d	       | xj                  dz  c_        ||   D ]=  }| j                  j                  d
d| j                  z  |j	                         fz         ? | xj                  dz  c_        | j                  j                  d| j                  z  d|d	        | xj                  dz  c_        | j                  j                  dd| j                  z  z         y)zWrite conditionsz-%s<if-else id="%d" pos="%d,%d" size="%d,%d">
rC  r   r]   r  r  r  r  z>
r  z</z%s</if-else>
N)GetBoundingBoxMinr  r  r  r9   r  r  r   r  r7   r   rC   )r)   r   bboxr   r    r   r6   s          r*   r  zWriteModelFile._condition	  s   **,<dkk!!  QQ
	
 !!#qGGMM$d&7&7&=? ""$ 	@A58}q GGMMdkk(91=>KK1Ka Y3sT[[7H$**,6WWXYKK1KGGMMt{{):A>?	@ 	q&#*;<=r,   c                    | j                   j                  dd| j                  z  |j                         |j	                         |j                         |j                         |j                         |j                         fz         y)zWrite commentz9%s<comment id="%d" pos="%d,%d" size="%d,%d">%s</comment>
rC  N)	r  r  r  r9   r  r  r  r  r   r  s     r*   r  zWriteModelFile._comment	  sj    Hdkk!  "!!#  "		
r,   N)r  r  r  r  r+   r  r  r  r  r  r  r  r	  r  r
  r  r  r   r,   r*   r  r    sL    .4:

A0@4
$@=D7?r;2!>F
r,   r  c                   H    e Zd ZdZed        Zdi fdZd Zed        Z	d Z
y)	WriteScriptFilez.Abstract class for scripts based on the model.c                 .    d| _         d| _        d| _        y)zConstructor to be overridden.N)r  r   r  r)   r  r   s      r*   r+   zWriteScriptFile.__init__	  s     
r,   Tc                 ~   t        |t              rC|r|j                         ry| j                  ||| j                  j                         dd        n-t        |t              st        |t              r|j                         }| j                  j                         D ]s  }t        j                  d|z         }|j                  |      s-||   j                  dd      }||   j                  dd      dk(  rd|z   dz   }|j                  ||      }u t        |t              rOt        d	 t        j                   d
|            \  }}	d| j"                  z  d|d}|	d   dk(  rd|	d   dk(  r\t%        d      j'                  t)        j                   |	dd             }
|dz  }|| j+                  |
t-        |      |g      dz   z  }n||	z  }| j.                  j1                  d|z         | xj"                  dz  c_        |j3                         }d||<   |j5                  | j                  j5                  t                    D ]  }| j7                  |d|        | xj"                  dz  c_        t        |t              r| j.                  j1                  d| j"                  z  d|d       | xj"                  dz  c_        |j5                         }|d   D ]  }| j7                  |d        |d    rr| xj"                  dz  c_        | j.                  j1                  d!d| j"                  z  z         | xj"                  dz  c_        |d    D ]  }| j7                  |d        | xj"                  dz  c_        | j.                  j1                  d"       t        |t8              r| j;                  |       yy)#z!Write model object to Python fileN   r   r   r  r  r   r=  c                 "    | j                         S rH   r?  r   s    r*   r   z,WriteScriptFile._writeItem.<locals>.<lambda>
  r@  r,   rA  rC  zfor z in r   rB  rf   r   r]   r   zgrass.read_command(rp   z.splitlines()z%s:
r  rB   F)ignoreBlockr&   zif z:
r  )r#  r  z%selse:
r7  )r2   rD   rV  _writePythonActionr   rj  rQ   rT   r   rn   r   r   r   r  r  r   r   r  r   r   r   _getPythonActionCmdrC   r  r  r-  r7   
_writeItemr   _writePythonComment)r)   r6   r#  r&   r`  r  r   r   rb  rc  r   variablesLoopr   	condItemss                 r*   r&  zWriteScriptFile._writeItem
  s;   dK(t0##i!?!?!A"1!E i(Jt^,L==?D JJ335 4**S8^4>>$'%h/33GR@E *..vx@HL #ec 1";;ud3D4 $	*$'',)E%! *-t{{):GDA;#%(2,#*=D>665;;xPQRT~;V6WD11D00s4yWI0V)*D
 H$Dgn-q  ) 0)-g&"mmDJJ,?,?,?,TU XFOOFOWXq $/cDKK.?FGq  MMO	'o ?FOOFO>?V$KK1$KGGMM+t{{1B"CDKK1$K"+F"3 CEBCq ddL)$$T* *r,   c                     |j                         j                         D ]#  }| j                  j                  d|z   dz          % y)z"Write model comment to Python file#r7  N)r   rY  r  r  )r)   r6   lines      r*   r'  z#WriteScriptFile._writePythonComment=
  s9    MMO..0 	-DGGMM#*t+,	-r,   c                     dj                  t        j                  dd|j                               |j	                         |       S )Nz%{module_name}{module_id}_{param_name}z
[^a-zA-Z]+r  )module_name	module_id
param_name)r   r   r  r   r9   )parameter_namer6   s     r*   _getParamNamezWriteScriptFile._getParamNameB
  s<    6==|RAjjl% > 
 	
r,   c           
         g }d}g }|d   D cg c]  }|d   	 }}|d   D ]  }	|	j                  d      |v r\t        |	j                  d            dk(  r?|j                  dj                  | j	                  |	j                  d      |                   |	j                  dd      s|	j                  dd      }
t        |
      dkD  r|j                  d|
z         ||
z  } d	j                  |      }|||fS c c}w )
a  Get item flags that are needed to be parsed in the script.

        :param item: module
        :param opts: options of the task
        :param variables: variables of the item
        :return: string with flag names set to True, string with
            comma-separated flags that are parameterized, list of
            parameterized boolean parameters like verbose or overwrite (needed
            as they are also tagged as flags)
        r  ry  r   r]   "{}"r   Fz%s=Truers  )r  rC   r3   r   r2  r   )r)   r6   optsr&   item_paramsitem_true_flagsitem_parameterized_flagsr  parameterized_flagsr  r   s              r*   _getItemFlagszWriteScriptFile._getItemFlagsJ
  s    #% 2;G2DEQqyEEg 
	,AuuV} 33AEE&M8Ja8O(//MM$"4"4QUU6]D"IJ uuWe$uuVR(t9q=&&y4'78#t+O
	, $(99-E#F  8+EE! Fs   C8N)r  r  r  r  r   r+   r&  r'  staticmethodr2  r:  r   r,   r*   r  r  	  sC    8  ,02 7+r-
 
 
Fr,   r  c                   `    e Zd ZdZd Zd Zd Zd Zd Zi dfdZ	i fd	Z
d
 Zd Zed        Zy)WritePyWPSFile*Class for exporting model to PyWPS script.c                 N    || _         || _        d| _        | j                          y)r>     N)r  r   r  _writePyWPSr  s      r*   r+   zWritePyWPSFile.__init__o
  s#    
r,   c           
         | j                   j                         }| j                  j                  d       | j                   j	                         D ]/  }| j                  || j                   j                         dd        1 | j                  j                  dj                  |d   |d   dj                  |d   j                                            | j                  j                  d	       | j                          | j                   j	                  t              D ]2  }|j                         d
   s| j                  j                  d        n | j                  j                  d       y)zWrite PyWPS model to filea   #!/usr/bin/env python3

import sys
import os
import atexit
import tempfile
from grass.script import run_command
from pywps import Process, LiteralInput, ComplexInput, ComplexOutput, Format


class Model(Process):

    def __init__(self):
        inputs = list()
        outputs = list()

Nr!  a          super(Model, self).__init__(
            self._handler,
            identifier="{identifier}",
            title="{title}",
            inputs=inputs,
            outputs=outputs,
            # here you could also specify the GRASS location, for example:
            # grass_location="EPSG:5514",
            abstract="{abstract}",
            version="1.0",
            store_supported=True,
            status_supported=True)
r   z""r   )
identifiertitleabstractz7
    @staticmethod
    def _handler(request, response):ry  z

def getParameterizedFlags(paramFlags, itemFlags):
    fl = ""
    for i in [key for key, value in paramFlags.items() if value[0].data == "True"]:
        if i in itemFlags:
            fl += i[-1]

    return fl
z

if __name__ == "__main__":
    from pywps.app.Service import Service

    processes = [Model()]
    application = Service(processes)
)r   rj   r  r  r7   _write_input_outputsrj  r   r   rY  _writeHandlerrD   r!  )r)   r$   r6   s      r*   rA  zWritePyWPSFile._writePyWPSw
  sD   ZZ--/
	
( JJ'') 	RD%%dDJJ,J,J,LRa,PQ	R 	 F%f- (:m#<#G#G#IJ  	
( 	(	
 	JJ''4 	D**,W5	 	  			
r,   c           
         |j                         }|d   D ]  }|d   r|d   }n|d   }|d   r&dj                  d| j                  dz   z  |d         n!dj                  d| j                  dz   z        d	}d
}d}| j                  |||d   |||       | j                  j                  d        |d   D ]  }	| j                  |	      }| j                  |	      d|	d   v rd	}d}| j                  |	d         }nd	}d
}dj                  |	d         }| j                  |||	d   |||       | j                  j                  d        |j                         d   D ]  }	| j                  |	      }|	d   |	d   }
|
dk(  s$t        fd|D              r9dk7  s|	|j                         d   v sTd}d}| j                  |	d         }| j                  |||	d   |||d       | j                  j                  d        y )Nry  r   r   r   z
{}default="{}"rC  r  z
{}default="False"inputsLiteralInputzdata_type="string",r   r7  rm   r	  ComplexInputr   zdata_type="{}"r  r
  newc              3   &   K   | ]  }|v  
 y wrH   r   .0ir   s     r*   	<genexpr>z6WritePyWPSFile._write_input_outputs.<locals>.<genexpr>       >1EQJ>   r  outputsComplexOutput)r!  r   r  _write_input_output_objectr  r  _getParamDesc_getParamValue_getSupportedFormatsr  any)r)   r6   intermediatesparameterized_paramsr  descio_dataobject_typeformat_specr   r
  r   s              @r*   rF  z#WritePyWPSFile._write_input_outputs
  sO   #::<(1 	 DG}G}M*G}*114;;?+T'] .44SDKK!O5LMG(K/K++V GGMM$7	 : *(3 	 E%%e,D''.E%-'","77hH",.55eFmD++f GGMM$/	 4 ^^%h/ 	$E%%e,D'NE,C
 u>>>b[ET-H-H-J8-T$T#-"77hH//[%-t[RT d#)	$r,   c           
          | j                   j                  dj                  ||| j                  ||      |||             y )Nz        {ins_or_outs}.append({lit_or_complex}(
            identifier="{param_name}",
            title="{description}",
            {special_params}{value}))
)ins_or_outslit_or_complexr0  r   special_paramsr   )r  r  r   r2  )r)   r^  r_  r   r6   r]  r`  r   s           r*   rV  z)WritePyWPSFile._write_input_output_object  sI     	 F#*--dD9 *  	
r,   c                     | j                   j                  t              D ]#  }| j                  ||j	                                % | j
                  j                  dj                  d| j                  z               y )Nrp   z
{}return response
rC  )	r   r7   rD   r&  r!  r  r  r   r  r?   s     r*   rG  zWritePyWPSFile._writeHandler2  sb    JJ''4 	KDOODD,G,G,IOJ	K 	-44S4;;5FGHr,   Nc                 n   t        d      j                  |j                  d            }dd| j                  z  z  }| j                  j                  || j                  ||t        |      dz
  |      z          |j                         d	   D ]#  }|d
   |d   }|dk(  st        fd|D              r)dk7  s||j                         d	   v sD|d   dk(  rd}d}	d}
n|d   dk(  rd}d}	d}
nd}d}	d}
|j                  dd      }| j                  ||      }|j                         }d|v r|d   du rdj                  |      }ndj                  |d
         }| j                  j!                         j                  d d      }|du r"d!j                  d| j                  d"z   z        }nd}| j                  j                  d#j                  ||d| j                  d"z   z  |d| j                  d"z   z  d| j                  d$z   z  d| j                  d$z   z  ||
d| j                  d"z   z  |	|%             d&j                  |      }d'j                  d| j                  d(z   z  d| j                  d(z   z  ||
)      }| j                  j                  d*j                  d| j                  z  ||             & y)+!Write model action to Python fileNr   Fr   r   z
%srun_command(rC  r]   rm   r   r
  rL  c              3   &   K   | ]  }|v  
 y wrH   r   rN  s     r*   rQ  z4WritePyWPSFile._writePythonAction.<locals>.<genexpr>I  rR  rS  r  r   rq  z	v.out.ogrz"GML"z.gmlrp  z
r.out.gdalz"GTiff"z.tifzWRITE YOUR EXPORT COMMANDz"WRITE YOUR EXPORT FORMAT"zWRITE YOUR EXPORT EXTENSIONr   r  Trequest.inputs["{}"][0].datar4  r  z,
{}overwrite=True   z
{run_command}"{cmd}",
{indent1}input={input},
{indent2}output=os.path.join(
{indent3}tempfile.gettempdir(),
{indent4}{out} + "{format_ext}"),
{indent5}format={format}{overwrite_string})
   )run_commandr   indent1r	  indent2indent3indent4out
format_extindent5r   overwrite_stringzresponse.outputs["{}"].filezNos.path.join(
{indent1}tempfile.gettempdir(),
{indent2}{out} + "{format_ext}")r  )rm  rn  rq  rr  z

{}{} = {})r   r   r   r  r  r  r%  rC   r  rZ  r!  r  r2  r   r   r   rj   )r)   r6   r&   r[  r   strcmdr   r
  r'  r   	extensionnr0  r   param_requestr  rt  left_side_outright_side_outr   s                      @r*   r$  z!WritePyWPSFile._writePythonAction8  s   ~**t{{%{/H*I#sT[['89T--dD#f+/9UU	

 ^^%h/ R	E'NE,C
 u>>>b[ET-H-H-J8-T$T?h.)G$F &I8_0*G&F &I :G9F =IIIfd+!//48
zz|"d*u_/E/M$B$I$I*$UM$*MM%.$AM !JJ446::;N	$'<'C'Ct{{R/0($ (*$ F$*# #t{{R'7 8+ #t{{R'7 8 #t{{R'7 8 #t{{R'7 8)#, #t{{R'7 8%)9  0 !> D DZ P%%+V #t{{Q 7 #t{{Q 7)#,	 &, &  !((dkk)=.]R	r,   c                    |j                         }d}|d   D cg c]  }|d   	 }}| j                  |||      \  }	}
}d }|d   D ]  }|j                  dd       }|j                  dd       }|r|s||v s0|j                  dd      }d}||v rId}d	|v r"d
j                  | j	                  ||            }n!dj                  | j	                  ||            }|s|dk7  r"|j                  dj                  ||             |j                  dj                  ||              |d|j                         z  z  }|	r7|dj                  d|z  |	      z  }|
r6|dj                  d|dz   z  |
      z  }n|
r|dj                  d|z  |
      z  }t        |      dkD  r-|dz  }|d d D ]  }|d|z  |dz  } |d|z  |d   dz  }n|dz  }|r#|dj                  d| j                  z  ||      z  }|S c c}w )Nr  rm   r   r   r  r   FTr	  zrequest.inputs["{}"][0].fileri  {}={}{}="{}""%s"z,
{indent}flags="{fl}"rC  r  flz1 + getParameterizedFlags(
{}request.inputs, [{}])r  z5,
{}flags=getParameterizedFlags(request.inputs, [{}])r   ,
rf   r<  z)
z&

{}response.outputs["{}"].file = "{}")	r   r:  r  r   r2  r3   get_namerC   r  )r)   r6   r   	cmdIndentr&   r5  r]  r  parameterizedParamsry  itemParameterizedFlagsrm   rq  r  r   r   r  foundVarr   s                      r*   r%  z"WritePyWPSFile._getPythonActionCmd  se   !2;H2EFQqyFF040B0B$	1
-%v h 	AA55&DEE'4(ED,?$?fh/ ..#H$ > E E ..tT:! !? E E ..tT:! u0MM'..u"=>MM)"2"24"?@-	A0 	v'',333?u3UUC%KRR9q=)+A  $KRRi!7 C v;?5LCcr{ :C)OS99:cIovbz::C5LC =DDdkk!3 C 
u Gs   G3c                 (    |d   r|d   }|S |d   }|S )Nr   r   r   )r)   r   r]  s      r*   rW  zWritePyWPSFile._getParamDesc  s*    >>D  'Dr,   c                     |d   rLd|d   vrE|d   dv r|d   }ndj                  |d         }dj                  d| j                  d	z   z  |      }|S d
}|S )Nr   outputr   r  )r  integerr4  z,
{}default={}rC  r  r  )r   r  )r)   r   r   s      r*   rX  zWritePyWPSFile._getParamValue  sn    >heFm;V} 44geGn5%,,SDKK!O-DeLE  Er,   c                 H    | dk(  rd}n
| dk(  rd}nd}dj                  |      S )znGet supported formats of an item.

        :param prompt: param['prompt'] of an item
        :return:
        rq  zFormat("application/gml+xml")rp  zFormat("image/tif")zFORMAT UNKNOWN - WRITE YOUR OWNzsupported_formats=[{}])r   )r   sup_formatss     r*   rY  z#WritePyWPSFile._getSupportedFormats  s4     X9Kx/K;K'..{;;r,   )r  r  r  r  r+   rA  rF  rV  rG  r$  r%  rW  rX  r;  rY  r   r,   r*   r=  r=  l
  s\    4P
dN$`
2I 244 [z DF >@ < <r,   r=  c                   :    e Zd Zd Zd Zd Zi dfdZi fdZd Zy)WritePythonFilec                 N    || _         || _        d| _        | j                          y)zWClass for exporting model to Python script

        :param fd: file descriptor
        r  N)r  r   r  _writePythonr  s      r*   r+   zWritePythonFile.__init__  s%    
 
r,   c                 L    |dk(  ry|dk(  ry|dk(  ry|dk(  ry|d	k(  ry
|dk(  ryy)Nrp  G_OPT_R_MAPrq  G_OPT_V_MAPrz  G_OPT_M_MAPSETr  G_OPT_F_INPUTr   G_OPT_M_DIRr{  G_OPT_M_REGIONr  r   )r)   r   s     r*   _getStandardizedOptionz&WritePythonFile._getStandardizedOption  sF    X x x#v"u_ x#r,   c                 
   | j                   j                         }| j                  j                  dj	                  d|d   |d   dj                  |d   j                               t        j                         d             | j                  j                  dj	                  d	j                  |d   j                               
             | j                   j                  t              }|D ]B  }|j                         d   D ]  }|d   r|d   }n|d   }| j                  j                  dj	                  | j                  |d   |      |             |d   r.| j                  j                  dj	                  |d                n| j                  j                  d       | j                  j                  d        |j                         d   D ]X  }|d   r|d   }n|d   }| j                  j                  dj	                  | j                  |d   |      |             |d   dk7  r.| j                  j                  dj	                  |d                n| j                  j                  d       |d   rc| j                  j                  d       | j                  j                  dj                  |d                | j                  j                  d       |d   r-| j                  j                  dj	                  |d                | j                  j                  d       [ E | j                  j                  d       | j                   j                         \  }}}	}
| j                  j                  d       |r8| j                  j                  d d!j                  t        d" |            z         |r8| j                  j                  d#d!j                  t        d$ |            z         |	r8| j                  j                  d%d!j                  t        d& |	            z         |s|s|	s| j                  j                  d'       | j                  j                  d(       | j                   j                  t              D ]#  }| j                  ||j                         )       % | j                  j                  d*       |D ]2  }|j                         d   s| j                  j                  d+        n | j                  j                  d,       |j!                  d-      r| j                  j                  d.       | j                  j                  d/       y0)1zWrite model to filez#!/usr/bin/env python3
#
#{header_begin}
#
# MODULE:       {module_name}
#
# AUTHOR(S):    {author}
#
# PURPOSE:      {purpose}
#
# DATE:         {date}
#
#{header_end}
zM#############################################################################r   r   z
# r   )header_beginr.  r   purposedate
header_endz1
# %module
# % description: {description}
# %end
rC  )r   ry  r   z# %option
# % key: {flag_name}
# % description: {description}
# % required: yes
# % type: string
# % options: True, False
# % guisection: Flags
)	flag_namer   r   z# % answer: {}
z# % answer: False
z# %end
rm   zQ# %option
# % key: {param_name}
# % description: {description}
# % required: yes
)r0  r   r  r  z# % type: {}
z# % type: double
r  z# % key_desc: rs  r7  zR
import sys
import os
import atexit

from grass.script import parser, run_command
z
def cleanup():
zO    run_command("g.remove", flags="f", type="raster",
                name=%s)
ri  c                     d| z   dz   S Nr=  r   r   s    r*   r   z.WritePythonFile._writePython.<locals>.<lambda>      q3 r,   zO    run_command("g.remove", flags="f", type="vector",
                name=%s)
c                     d| z   dz   S r  r   r   s    r*   r   z.WritePythonFile._writePython.<locals>.<lambda>  r  r,   zR    run_command("g.remove", flags="f", type="raster_3d",
                name=%s)
c                     d| z   dz   S r  r   r   s    r*   r   z.WritePythonFile._writePython.<locals>.<lambda>  r  r,   z	    pass
z
def main(options, flags):
rp   z    return 0
z
def getParameterizedFlags(paramFlags, itemFlags):
    fl = ""
    for i in [key for key, value in paramFlags.items() if value == "True"]:
        if i in itemFlags:
            fl += i[-1]

    return fl
zW
if __name__ == "__main__":
    options, flags = parser()
    atexit.register(cleanup)
r  z(    os.environ["GRASS_OVERWRITE"] = "1"
z#    sys.exit(main(options, flags))
N)r   rj   r  r  r   r   rY  timeasctimer7   rD   r!  r2  rj  r   r&  r  )r)   r$   
modelItemsr6   r  r]  r   rk  rl  rm  rn  s              r*   r  zWritePythonFile._writePython  s   ZZ--/
 	 F%&v.!(+J}$=$H$H$JK\\^#  	
2 	 FHHZ%>%I%I%KL  	
 ZZ((5
 2	*D335g> *==D.D F"&"4"4T&\4"H$(   =GGMM"4";";DM"JKGGMM"78j)-*0 446x@ *> >D /D F#'#5#5eFmT#J$(  	 =G+GGMM"2"9"9%-"HIGGMM"67$GGMM"23GGMM$))E*,=">?GGMM$'>GGMM"4";";E'N"KLj)3*32	*j 		
 #'**"@"@"BdFC	

 GGMM ((36=>? GGMM ((36=>? GGMM ((36?@A DGGMM,'56JJ''4 	KDOODD,G,G,IOJ	K 	&' 	D**,W5
 	 		
 >>+&GGMMEF<=r,   Nc           
          t        d      j                  |j                  d            }dd| j                  z  z  }| j                  j                  || j                  ||t        |      |      z   dz          y)	rg  Nr   Fr   r   z%srun_command(rC  r7  )r   r   r   r  r  r  r%  rC   )r)   r6   r&   r[  r   ru  s         r*   r$  z"WritePythonFile._writePythonAction  sj    ~**t{{%{/H*I!S4;;%67T--dD#f+yQQTXX	
r,   c                 J   |j                         }d}|d   D cg c]  }|d   	 }}| j                  |||      \  }	}
}|d   D ]  }|j                  dd       }|j                  dd       }|r|s||v s0|j                  dd      }d}||v r#d}d	j                  | j	                  ||            }|s|dk7  r"|j                  d
j                  ||             |j                  dj                  ||              |d|j                         z  z  }|	r0|dj                  d|z  |	      z  }|
r/|dj                  |
      z  }n|
r|dj                  d|z  |
      z  }t        |      dkD  r.|dz  }|d d D ]  }|d|z  |dz  } |d|z  |d   dz  }|S |dz  }|S c c}w )Nr  rm   r   r   r  r   FTzoptions["{}"]r|  r}  r~  z,
{indent}flags='{fl}'rC  r  z' + getParameterizedFlags(options, [{}])z.,
{}flags=getParameterizedFlags(options, [{}])r   r  rf   r<  )r   r:  r  r   r2  r3   r  rC   )r)   r6   r   r  r&   r5  r]  r  r  ry  r  rm   r  r   r   r  r  r   s                     r*   r%  z#WritePythonFile._getPythonActionCmd  s    !2;H2EFQqyFF040B0B$	1
-%v h 	AA55&DEE'4(ED,?$?fh/ ..#H+2243E3EdD3QREu0MM'..u"=>MM)"2"24"?@	A" 	v'',333?u3UUC%@GG*  $DKKi!7 C v;?5LCcr{ :C)OS99:cIovbz::C 
 3JC
W Gs   F c                    d}t        j                  d|z   dz   |      }|d   s|d   s	|rd|z  S |S |D ]E  }|r|dk(  r|d|z   k(  r|r	|d	|z  z  }|d
|z  z  }'|d|z   z  }|j                  d      rA|dz  }G |j                  d      S )zSubstitute variable in the string

        :param string: string to be modified
        :param variable: variable to be substituted
        :param data: data related to the variable

        :return: modified string
        r  z\w*(%z)w*r   rf   zoptions['%s']r=  r   z+options['%s']+z+%s+]+)r   r   endswithr   )r)   r   r  rq   r5   ssss          r*   _substituteVariablez#WritePythonFile._substituteVariable  s     XXg(50&9!uRV&11 	"ASC(N"/(::Ffx//F#'!zz#cMF	" ||C  r,   )	r  r  r  r+   r  r  r$  r%  r  r   r,   r*   r  r    s1    	 g>R 244 
 DF /b !r,   r  c                       e Zd Zej                   ed      ej                  ej                  z  fdZd Z	d Z
d Zd Zd Zy)	rO  zModel parametersc                    || _         || _        || _        t               | _        t        j                  j                  | f||||d| t        | t        j                        | _        | j                         }t        j                  | j                  j                  d       t        j                  | t!        d            | _        | j"                  j%                  d       | j                  j'                         \  }	}
}}|	s|
s|s| j"                  j)                          t+        | t
        j,                        | _        t+        | t
        j0                  t!        d      	      | _        | j2                  j5                          | j7                          | j9                         }| j;                  |       | j=                  |j>                  |j@                  |jB                  d
   z   |jD                  z
  f       y)zModel parameters dialog)rR   r   rD  r9  )rR   r9  r   z$Delete intermediate data when finish)rR   r   T)rR   r   z&Run)rR   r   r   r]   N)#rR   _modelrm   r   tasksrM   Dialogr+   r   r   FNPageDStylenotebook_createPages	CallAfterSetSelectionCheckBoxr!   	interDatarE  rj  Hider   	ID_CANCEL	btnCancelrQ  btnRun
SetDefault_layoutGetBestSize
SetMinSizer   r   r   constrained_sizepanelMinHeight)r)   rR   r   rm   r   rD  r9  kwargspanelrk  rl  rm  rn  r   s                 r*   r+   zModelParamDialog.__init__  s    V

			
Be5	
DJ	
 "Y5K5KL!!#
T]]//3 q!GH
 	%"&++"A"A"CdFCDNN!t=DRXXQvYG !ZZu'='=a'@@5CWCWWX	
r,   c                    t        j                         }|j                  | j                         |j                  | j                         |j                          t        j                  t         j                        }|j                  | j                  dt         j                         | j                  j                         r|j                  | j                  dt         j                  t         j                  z  t         j                  z  d       |j                  t        j                  | t         j                   t         j"                        dt         j                  t         j$                  z  t         j&                  z  d       |j                  |dt         j                  t         j                  z  d       | j)                  |       |j+                  |        y )Nr]   )
proportionr  r      )r  r  border)rR   r   r9  )rM   StdDialogButtonSizer	AddButtonr  r  RealizeBoxSizerVERTICALAddr  EXPANDr  IsShownALLALIGN_CENTER
StaticLineID_ANYLI_HORIZONTALLEFTRIGHTSetSizerFit)r)   btnSizer	mainSizers      r*   r  zModelParamDialog._layoutK  s:   **,4>>*4;;'KK,	dmm		B>>!!#MMYY'"//9	   MMTbiir?O?OPYY(2883	   	h1299rvv3EaPi dr,   c                 \   dgt        | j                  j                               z  }t        j                  | j                        D ]  \  }}|||d   <    |D ]P  }| j                  |   }| j                  ||      }|dk(  rt        d      }| j                  j                  ||       R S )z1Create for each parameterized module its own pager  ra   r&   	Variables)pager   )	rC   rm   r   rI   rJ   _createPager!   r  AddPage)r)   nameOrderedr   rm   r  s        r*   r  zModelParamDialog._createPagesg  s    dS!1!1!344MM$++6 	.LD&)-Ku&	. 	9D[[&F$$T62E{"~MM!!u4!8	9 r,   c                 <   |t         j                  v rt        j                  |      }nt        j                         }|d   |_        |d   |_        t        | t        j                  |t        | j                              }| j                  j                  |       |S )zDefine notebook pagery  rm   )rR   r   r   giface)r   grassCmdrW  	grassTaskry  rm   r   rM   r  r   r  r  r3   )r)   r   rm   r   r  s        r*   r  zModelParamDialog._createPageu  s}    9%%%??4(D??$DG_
X&yy1$++>	
 	

$r,   c                 b    t               }| j                  D ]  }||j                         z  } |S )z&Check for errors, get list of messages)r   r  r   )r)   r   r   s      r*   rR  zModelParamDialog.GetErrors  s6    &JJ 	,Dt))++G	, r,   c                 n    | j                   j                         r| j                   j                         ryy)z$Check if to detele intermediate dataTF)r  r  	IsCheckedr.   s    r*   rS  z'ModelParamDialog.DeleteIntermediateData  s'    >>!!#(@(@(Br,   N)r  r  r  rM   r  r!   DEFAULT_DIALOG_STYLERESIZE_BORDERr+   r  r  r  rR  rS  r   r,   r*   rO  rO    sG     99"#%%(8(88,
\8&r,   rO  )Er  r   r"   r-  r   r  r  rI   xml.etree.ElementTreer   ElementTreeImportErrorelementtree.ElementTreexml.sax.saxutilssaxr  rM   abcr   r   wx.libr   corer   r   	core.gcmdr   r	   r
   r   r   r   core.settingsr   gui_core.formsr   r   gui_core.widgetsr   gui_core.wrapr   r   gmodeler.gifacer   grass.scriptr   rW  objectr   r  r  rD   r,  ry   rW  r   ro  r&  rQ   r  rT   r   r   r  r  r=  r  r  rO  r   r,   r*   <module>r     s  < 
   	   
,)) $ # 	 #     ' ( & ( : &yF yxg& gT_,+s// _,DNS-- NbGCMM GT* *ZM,	3-- M,`O)Y 0 0 O)d:#; 2 2 :#z{ {|	C
 C
L
qFc qFhL<_ L<^^!o ^!B	yryy ygg  ,++,s   	E7 7FF