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)
)
)
)

  1. #1 by Takayuki ishii - 2月 24th, 2016 at 02:01

    CIVILを使用していまして、LISPのことについて調べていましたらこちらのページを拝見させて頂きましてコメントさせて頂きました。

    やりたい作業なのですが、
    1、点群からサーフェスを作成
    2、等高線表示にして、一つ一つの等高線をポリラインとしてオブジェクトを抽出する
    3,ユーザーが指定したポリラインを別の図面にコピペする

    このような操作を組みたいのですが、途中でダイアログボックスが表示され、コマンドが終了してしまいます。
    dclファイルを作らずに操作を続けられる方法はありますでしょうか。

    勉強不足承知の上でお聞き致しますが、教えていただけますでしょうか。
    宜しくお願い致します。

  2. #2 by yuri - 2月 25th, 2016 at 09:30

    はじめまして~。

    >このような操作を組みたいのですが、途中でダイアログボックスが表示され、コマンドが終了してしまいます。
    ダイアログボックスが表示されるということは、command関数を使ってる、ということでしょうか?
    私の認識では、C3Dはダイアログボックスなどでのオプション指定が多いので、command関数はほとんど使えないと思います。
    この投稿で使ってるように、VLISP関係の関数が得策かなぁと。

    ・・・と言っても、日本にはほぼ情報はないので、海外の情報をあさるか、vlax-dump-objectでガリガリ調べるか?と、泥臭いことに(^^;

    あまりお役に立てる情報じゃないかもしれませんが、すみません。

(will not be published)
  1. No trackbacks yet.