Archive for 2014年7月

Civil3D VLISP 三連発

お久しぶりでございます。

半年に1回の更新になってるのではないか?という Yuri Weblog です。
書籍の宣伝に成り下がってるので、ここら辺でマニアックすぎるネタを・・・。

その名も、Civil3D VLISP 三連発!!!

ダイアログなんかで操作してられないっすよ~、という私のために。
いまだにVLISPなの?どうなの?
.NETとか勉強する時間欲しいっす・・・。

;;
;;範囲指定して土量サーフェスを作成
;;1) 現況地形のサーフェスの名前を入力
;;2) コピー先のサーフェスの名前を入力
;;3) サーフェスの範囲をポリラインで指定
;;
(defun c:-createvolumesurface(
/
SourceSurfName
SourceSurfObj
CopySurfName
BoundaryPlineEname
BoundaryPlineObj
SsSurf
MeanElev
ContoursObj
)
;ユーザ入力
(while (or (not (setq SourceSurfName (getstring “\n現況地形のサーフェスの名前を入力:”))) (= SourceSurfName “”)))
(while (or (not (setq CopySurfName (getstring “\nグリッド範囲の名前を入力:”))) (= CopySurfName “”)))
(while (not (setq BoundaryPlineEname (entsel “\nグリッド範囲のポリラインを指示:”))))
(setq BoundaryPlineObj (vlax-ename->vla-object (car BoundaryPlineEname)))

;オブジェクト変換
(setq SsSurf (ssget “X” ‘((0 . “AECC_TIN_SURFACE”))))
(foreach n (y_ssname SsSurf)
(if (= SourceSurfName (vlax-get-property (vlax-ename->vla-object n) ‘Name))
(progn
(setq SourceSurfObj (vlax-ename->vla-object n))
(setq SsSurf nil)
)
)
)

;平均標高取得
(setq MeanElev (Pwr_MeanElevation SourceSurfObj BoundaryPlineObj))

;グリッド範囲サーフェス作成
;ポリライン標高変更
(y_dxfchange 38 MeanElev (entget (car BoundaryPlineEname)))
;サーフェス作成
(Pwr_CreateSurface CopySurfName)
(setq CopySurfObj (vlax-ename->vla-object (entlast)))
;等高線として追加
(setq ContoursObj (vlax-get-property CopySurfObj ‘Contours))
(vlax-invoke-method ContoursObj ‘Add BoundaryPlineObj ” ” 15.0 0.0698 100.0 1.0)
)
;;
;;サーフェスとポリラインを引数にして平均標高を取得
;;
(defun Pwr_MeanElevation(
SourceSurfOBJ
BoundaryPlineObj
/
CopySurfObj
MeanElev
)
;サーフェスの作成と境界追加
(Pwr_CreateSurface “TempSurface”)
(setq CopySurfObj (vlax-ename->vla-object (entlast)))
(vlax-invoke-method CopySurfObj ‘PasteSurface SourceSurfObj)
(setq BoundaryObj (vlax-get-property CopySurfObj ‘Boundaries))
(vlax-invoke-method BoundaryObj ‘Add BoundaryPlineObj “a” 4 T 1.0)

;平均標高取得
(setq MeanElev (vlax-get-property (vlax-get-property CopySurfObj ‘Statistics) ‘MeanElevation))
(vlax-invoke-method CopySurfObj ‘Delete)
MeanElev
)
;;
;;名前を引数にしてTINサーフェス作成
;;
(defun Pwr_CreateSurface(
SurfaceName
/
prod
verstr
prodStr
datastr
C3D
C3Ddoc
surfs
tincreationdata
surf
)

(setq prod (vlax-product-key))
(setq verstr
(cond
;;2010
((vl-string-search “\\R18.0\\” prod) “7.0”)
;;2011
((vl-string-search “\\R18.1\\” prod) “8.0”)
;;2012
((vl-string-search “\\R18.2\\” prod) “9.0”)
;;2013
((vl-string-search “\\R19.0\\” prod) “10.0”)
;;2014
((vl-string-search “\\R19.1\\” prod) “10.3”)
)
)
(setq prodStr (strcat “AeccXUiLand.AeccApplication.” verstr))
(setq datastr (strcat “AeccXLand.AeccTinCreationData.” verstr))

(if
(and (setq *acad* (vlax-get-acad-object))
(setq C3D (vla-getinterfaceobject *acad* prodStr))
(setq C3Ddoc (vla-get-activedocument C3D))
(setq surfs (vlax-get C3Ddoc ‘surfaces))
(setq tincreationdata (vla-getinterfaceobject *acad* datastr))
)
(progn
(vlax-put tincreationdata ‘baselayer “0”)
(vlax-put tincreationdata ‘layer “0”)
(vlax-put tincreationdata ‘name SurfaceName)

;;style must exist!
(vlax-put tincreationdata ‘style “MLIT-境界@サーフェス”)
(setq surf (vlax-invoke-method surfs ‘addtinsurface tincreationdata))

;; do whatever else is needed
(vlax-release-object tincreationdata)
(vlax-release-object surf)
(vlax-release-object surfs)
(vlax-release-object c3ddoc)
)
)
)

2 Comments