GeoStrat - Generatore modelli 3D per stratigrafia

Sondaggi e rilievo Il GeoStrat è un programma nato dall'esigenza di realizzare un modello solido tridimensionale partendo dal rilievo topografico di un'area e dai sondaggi geognostici al fine di poter generare le sezioni geologiche in qualsiasi punto del terreno oggetto di studio. Scritto in Visual Basic e AutoLISP il programma si appoggia su dei file csv preventivamente creati o manipolati in Excel© contenenti il rilievo topografico, le coordinate con l'ubicazione dei sondaggi ed i risultati (candele o colonne) dei sondaggi stessi. Si è volutamente scelto di ricorrere ad un file csv perché l'output degli strumenti di rilievo non è omogeneo, cambia a seconda del produttore, ed i file che si usavano per leggere i punti erano sempre differenti, quindi sfruttando le potenzialità del foglio di calcolo è più semplice uniformare i dati. Una volta preparato il file con i dati di partenza, il risultante file csv viene dato in pasto ad AutoCAD©, dove da codice vengono inseriti nell'ambiente grafico i punti restituiti dal rilievo topografico e le colonne relative ai sondaggi geognostici veri e propri.

Sondaggi
Sondaggi
A questo punto il programma chiede all'utente il grado di precisione che vuole per il solido finale e tramite interpolazione calcola i vertici dei triangoli costituenti le superfici che separano i diversi strati geognostici. Ogni strato viene messo su un layer specifico per il tipo di materiale e con i vertici si costruisce una mesh costituita da elementi 3DFACE. Tramite una funzione in AutoLISP si generano i solidi 3D dei vari strati e questi sono quindi gestibili tramite tutte le operazioni booleane di AutoCAD © per ottenere le Sezioni Stratigrafiche.

Di seguito il codice AutoLISP per la generazione dei solidi.

; Face2Vol.lsp creates 3DSolids from 3DFaces
; R.D.Ramirez - GTA Srl; AutoCAD 2010

; **********************************************************************************************************
(defun 3DPROC (/ CNT ACT_ELE SELSET ACT_ELIST P1 P2 P3 GES_VOLUME)
  ; global SAVE_CNT Z_MIN Z_MAX
  (setq selset (ssget "_p" '((0 . "3DFACE")))) ; select 3dfaces only
  (setq CNT 0)
  (repeat (sslength selset)
    (setq act_ele (ssname selset cnt))	
    (command "_chprop" act_ele "" "_co" "2" "")	
    (setq act_elist (entget act_ele))		
    (setq
      	P1 (trans (cdr (assoc 10 act_elist)) 0 1)
	    	P2 (trans (cdr (assoc 11 act_elist)) 0 1)
    		P3 (trans (cdr (assoc 12 act_elist)) 0 1)
    ) ; setq


    (command "_pline"
	     (list (car P1) (cadr P1) Z_MIN)
	     (list (car P2) (cadr P2) Z_MIN)
	     (list (car P3) (cadr P3) Z_MIN)
	     "_c"
    )					; command
    (command "_extrude" (entlast) "" Z_MAX)   
    (command "_slice" (entlast) "" "_3p" P1 P2 P3 (list (car P1) (cadr P1) Z_SEL)) ; Z_MAX ... upper level of extrusion; Z_MIN ... lower level of extrusion

    (if (> cnt 0) (command "_union" ges_volume (entlast) "")) ; union extruded triangles
    (command "_chprop" act_ele "" "_la" PROC_LAYER "") ; move processed triangles to layer "proc"
    (setq ges_volume (entlast))
    (setq save_cnt (1+ save_cnt))

    (if	(= save_cnt 5000)
      (progn
	(command "_qsave")
	(setq save_cnt 0)
       )
    )	
    (setq cnt (1+ cnt))
  ) ; repeat
) ; EODEFUN 3DPROC
; **********************************************************************************************************

; main

(prompt "face2vol ver. 3.5 R.Marschallinger 2009 (AutoCAD 2010)\n")
(prompt "for performance, set shademode to 2D")
(command "_osnap" "_none")
(setvar "delobj" 1)
(setvar "cmdecho" 0)
(setvar "solidhist" 0)

(setq
  save_cnt 0
  Z_SEL 0.0
  Z_MIN 0.0
  Z_MAX 0.0
  Z_ADD 0.001 
)

(alert "Input lower and upper levels (z) of solid model to be created")
(setq z_min (- (getreal "\nZ min: ") Z_ADD))
(setq z_max (+ (getreal "\nZ max: ") Z_ADD))

(initget "U D u d")
(setq TYP (strcase (getkword "\t\t extrude solid upward or downward [U D] : ")))
(if (= TYP "U") (setq Z_SEL Z_MAX) (setq Z_SEL Z_MIN)) 

(initget "R r I i")
(setq TYP (strcase (getkword "\t\t regular or irregular arrangement of input 3Dfaces [R I] : ")))

(setq prefix (getstring "\nLayer prefix: "))

(setq z_max (- z_max z_min))

(setq 3D_LAYER (strcat prefix "_3DSOLID"))
(setq PROC_LAYER (strcat prefix "_PROC"))

(command "_elev" "0.0" "0.0")
(command "_layer" "_n" PROC_LAYER "_f" PROC_LAYER "_m" 3D_LAYER "_co" "1" 3D_LAYER "")

(if (= TYP "R") ; regular grid ...
  (progn
    	(command "_plan" "")
    	(alert "pick lower left corner")
	(setq lowleft (getpoint "\nlower left corner"))
	(alert "pick upper right corner")
	(setq upright (getpoint "\nupper right corner"))

	(setq num_slices (getint "\nnumber of columns : "))
	(setq col_width (abs (/ (- (car lowleft) (car upright)) num_slices)))

	(setq X_LOW (car lowleft) X_HIGH (+ X_LOW col_width) Y_LOW (cadr lowleft) Y_HIGH (cadr upright))

	; aggregate 3DFACES columnwise
	(repeat	num_slices
  		(setq	selset (ssget "_c" (list X_LOW Y_LOW)(list X_HIGH Y_HIGH)'((0 . "3DFACE")))) 
  		(3DPROC)
  		(setq X_LOW X_HIGH X_HIGH (+ X_HIGH COL_WIDTH)) 
	) ; repeat

	(setq selset (ssget "_c" LOWLEFT UPRIGHT '((0 . "3DSOLID")))) 
	(command "_union" selset "")
  ) ; progn
) ; if

(if (= TYP "I")
	(progn
	  	(INITGET "Y y N n")
	  	(setq HIDETYPE (strcase (getstring "freeze layer with processed triangles [y n] ? ")))
	  	(if (= HIDETYPE "N") (command "_layer" "_th" PROC_LAYER ""))
			(prompt "\nselect 3Dfaces [all select modes]")
			(command "_select" pause)
			(setq selset (ssget "_p"  '((0 . "3DFACE")))) 
	  		(3DPROC)
	) ; progn
) ; if