TOP PAGE > 記事閲覧
モデルタブでの簡易印刷
投稿日 : 2019/09/16(Mon) 14:47
投稿者 だい
参照先
モデルタブで、スケールと印刷範囲を設定,確認してから印刷できるようにLISPを作りました。
LISPでの印刷情報の取得,設定について、↓こちらのページを参考にしました。
https://knowledge.autodesk.com/ja/support/autocad/troubleshooting/caas/sfdcarticles/sfdcarticles/kA230000000tzGC.html
印刷情報の取得に時間がかかり、ダイアログが表示されるまで3〜4秒かかります。

↓をModelPrint.lspとして保存して下さい。(ダイアログ設定項目の保存用のModelPrint.txtが同じフォルダに作られます)

(defun C:ModelPrint( / acadObject acadDocument acadLayoutsCollection activeLayoutObject DeviceNames plotters PlotStyleNames styles cnt dn psn)
(vl-load-com)
(setq acadObject (vlax-get-Acad-object))
(setq acadDocument (vla-get-ActiveDocument acadObject))
(setq acadLayoutsCollection (vla-get-layouts acadDocument))
(setq activeLayoutObject (vla-Get-ActiveLayout acadDocument))
(vla-RefreshPlotDeviceInfo activeLayoutObject)

(setq DeviceNames (vla-GetPlotDeviceNames activeLayoutObject));設定可能な印刷デバイスのリスト取得
(setq plotters (vlax-safearray->list (vlax-variant-value DeviceNames)))
(setq cnt 0)
(repeat (length plotters)
(if (= cnt 0)
(setq dn (list (nth cnt plotters)))
(setq dn (append dn (list (nth cnt plotters))))
);if
(setq cnt (1+ cnt))
);repeat

(setq PlotStyleNames (vla-GetPlotStyleTableNames activeLayoutObject));設定可能な印刷スタイルのリスト取得
(setq styles (vlax-safearray->list (vlax-variant-value PlotStyleNames)))
(setq cnt 0)
(repeat (length styles)
(if (= cnt 0)
(setq psn (list (nth cnt styles)))
(setq psn (append psn (list (nth cnt styles))))
);if
(setq cnt (1+ cnt))
);repeat
(princ)

(DialogSetting dn psn);list5_data list6_data)
);C:ModelPrint

(defun DialogSetting ( dn psn / fpt MPS dcl_id set_val set_lst list0_data list1_data list2_data list3_data list4_data list7_data list0_val list1_val
list2_val list3_val list4_val list5_val list6_val list7_val Wscale_val sel_list0 sel_list1 sel_list2 sel_list4 sel_list5 sel_list6 sel_list7 ddiag)

(setq fpt (strcat (vl-string-right-trim "lsp" (findfile "ModelPrint.lsp")) "txt"));ダイアログ項目の保存用テキストファイルのフルパス
(setq MPS (open fpt "r"))
(if (= MPS nil)
(setq set_lst (list "0" "0" "3" "1" "4" "1" "0" "0" "1"));初回 ModelPrint.txt が存在しない場合
(progn
(setq set_val (read-line MPS))
(setq set_lst (list set_val))
(while (/= set_val nil)
(setq set_val (read-line MPS))
(setq set_lst (append set_lst (list set_val)))
);while
(close MPS)
);progn
);if

(setq list0_val (nth 0 set_lst))
(setq list1_val (nth 1 set_lst))
(setq list2_val (nth 2 set_lst))
(setq list3_val (nth 3 set_lst))
(setq list4_val (nth 4 set_lst))
(setq list5_val (nth 5 set_lst))
(setq list6_val (nth 6 set_lst))
(setq list7_val (nth 7 set_lst))
(setq Wscale_val (nth 8 set_lst))

(setq list0_data (list "A4" "A3" "A2" "A1"))
(setq list1_data (list "縦" "横"))
(setq list2_data (list "10" "20" "25" "50" "100" "200" "250" "300" "400" "500" "1000" "2000" "5000" "10000" "20000"))
(setq list3_data (list "m" "mm"))
(setq list4_data (list "1" "10" "20" "50" "100" "200" "250" "300" "400" "500" "1000" "2000"))
(setq list7_data (list "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"))

(setq dcl_id (load_dialog "ModelPrint.dcl"))
(new_dialog "ModelPrint" dcl_id "" '(1650 150))

(start_list "list0" 3)
(mapcar 'add_list list0_data)
(end_list)

(start_list "list1" 3)
(mapcar 'add_list list1_data)
(end_list)

(start_list "list2" 3)
(mapcar 'add_list list2_data)
(end_list)

(start_list "list3" 3)
(mapcar 'add_list list3_data)
(end_list)

(start_list "list4" 3)
(mapcar 'add_list list4_data)
(end_list)

(start_list "list5" 3)
(mapcar 'add_list dn)
(end_list)

(start_list "list6" 3)
(mapcar 'add_list psn)
(end_list)

(start_list "list7" 3)
(mapcar 'add_list list7_data)
(end_list)

(set_tile "list0" list0_val)
(set_tile "list1" list1_val)
(set_tile "list2" list2_val)
(set_tile "list3" list3_val)
(set_tile "list4" list4_val)
(set_tile "list5" list5_val)
(set_tile "list6" list6_val)
(set_tile "list7" list7_val)
(set_tile "Wscale" Wscale_val)

(action_tile "accept" "(SaveTileVal)(done_dialog 1)");OKボタンの場合
(action_tile "cancel" "(done_dialog 0)");キャンセルボタンの場合

(defun SaveTileVal()
(setq list0_val(atoi(get_tile "list0")))
(setq list1_val(atoi(get_tile "list1")))
(setq list2_val(atoi(get_tile "list2")))
(setq list3_val(atoi(get_tile "list3")))
(setq list4_val(atoi(get_tile "list4")))
(setq list5_val(atoi(get_tile "list5")))
(setq list6_val(atoi(get_tile "list6")))
(setq list7_val(atoi(get_tile "list7")))
(setq Wscale_val(atoi(get_tile "Wscale")))

(setq sel_list0(nth list0_val list0_data))
(setq sel_list1(nth list1_val list1_data))
(setq sel_list2(nth list2_val list2_data))
;(setq sel_list3(nth list3_val list3_data))
(setq sel_list4(nth list4_val list4_data))
(setq sel_list5(nth list5_val dn))
(setq sel_list6(nth list6_val psn))
(setq sel_list7(nth list7_val list7_data))

(setq MPS (open fpt "w"))
(write-line (itoa list0_val) MPS)
(write-line (itoa list1_val) MPS)
(write-line (itoa list2_val) MPS)
(write-line (itoa list3_val) MPS)
(write-line (itoa list4_val) MPS)
(write-line (itoa list5_val) MPS)
(write-line (itoa list6_val) MPS)
(write-line (itoa list7_val) MPS)
(write-line (itoa Wscale_val) MPS)
(close MPS)
);SaveTileVal

(setq ddiag (start_dialog))
(unload_dialog dcl_id)

(if(= ddiag 1)(ModelPrint_1 dn psn sel_list0 sel_list1 sel_list2 sel_list4 sel_list5 sel_list6 sel_list7 list3_val Wscale_val)(setvar "CMDECHO" 1));OKボタンの場合の処理
(princ)
);DialogSetting

↓に続きます
記事編集 編集
Re: モデルタブでの簡易印刷
投稿日 : 2019/09/16(Mon) 14:49
投稿者 だい
参照先
(defun ModelPrint_1( dn psn sel_list0 sel_list1 sel_list2 sel_list4 sel_list5 sel_list6 sel_list7 list3_val Wscale_val / clay width height uh)
(setvar "CMDECHO" 0);command 関数を実行中にプロンプトとユーザ入力をエコーバック表示しない

(setq clay(getvar "CLAYER"));現在層の名前を取得
(command "-layer" "on" clay "");指定したレイヤーの表示をON
(command "-layer" "u" clay "");指定したレイヤーのロック解除

(cond
((= sel_list0 "A4")(setq width "0.210")(setq height "0.297"))
((= sel_list0 "A3")(setq width "0.297")(setq height "0.420"))
((= sel_list0 "A2")(setq width "0.420")(setq height "0.594"))
((= sel_list0 "A1")(setq width "0.594")(setq height "0.841"))
);cond

(if (= list3_val 0)
(setq uh "1")
(setq uh "1000")
);if

(setq width (/ (atof width) (/ 1 (atof sel_list2))))
(setq height (/ (atof height) (/ 1 (atof sel_list2))))

(setq width (/ (* width (atof uh)) (atof sel_list4)))
(setq height (/ (* height (atof uh)) (atof sel_list4)))


(command "_undon" "be" );(undo)UNDO開始点 ここまで一気に戻せるようにする
(command "_ccs" "w");(ucs)

(if (= sel_list1 "縦")
(command "_rectangle" "0,0" "d" width height );原点に印刷範囲の矩形を描く
(command "_rectangle" "0,0" "d" height width )
);if

(command "_cut" "l" " " );原点に描いた矩形を切り取る
(setq osm (getvar "OSMODE"));現在のオブジェクトスナップモードを記憶
(setvar "OSMODE" 0);オブジェクトスナップモードを解除する
(command "_paste" pause);切り取った矩形を貼付
(setvar "OSMODE" osm);オブジェクトスナップモードを元に戻す

(if (alert "印刷しますか?" "印刷確認" "QUESTION")
(progn;YESボタンの場合の処理
(ModelPrint_2 width height uh sel_list0 sel_list1 sel_list2 sel_list4 sel_list5 sel_list6 sel_list7 Wscale_val);OKボタンの場合の処理
(DialogSetting dn psn);もう一度最初のダイアログを表示する
);progn
(progn;NOボタンの場合の処理
(command "_undon" "e" "u");(undo)UNDO開始点(BE)からの操作を取り消し、
(DialogSetting dn psn );もう一度最初のダイアログを表示する
);progn
);if
(princ)
);ModelPrint_1

(defun ModelPrint_2(width height uh sel_list0 sel_list1 sel_list2 sel_list4 sel_list5 sel_list6 sel_list7 Wscale_val
/ X Y ichiA ichiB Psyakudo TX TY TH ichiT tateyoko)
(setvar "CMDECHO" 0);command 関数を実行中にプロンプトとユーザ入力をエコーバック表示しない
(setq X (cadr (assoc 10 (entget (entlast)))))
(setq Y (caddr (assoc 10 (entget (entlast)))))

(setq ichiA (list X Y))
(if (= sel_list1 "縦")
(setq ichiB (list (+ X width) (+ Y height)))
(setq ichiB (list (+ X height) (+ Y width)))
);if

(setq Psyakudo (rtos (* (/ (atof sel_list2) 1000)(/ (atof uh) (atof sel_list4)))))

(setq TX (- (car ichiB)(* 0.03 (atof sel_list2) (atof uh))))
(setq TY (- (cadr ichiB)(* 0.01 (atof sel_list2) (atof uh))))
(setq TH (* 0.004 (atof sel_list2) (atof uh)))
(setq ichiT (list TX TY))

(if (= Wscale_val 1)
(command "-simplenote" ichiT TH "0" (strcat "S=1:" sel_list2 ));(-text)
);if

(if (= sel_list1 "縦")
(setq tateyoko "p")
(setq tateyoko "l")
);if

(repeat (atoi sel_list7) (command "-print" "y" "Model" sel_list5 sel_list0 "m" tateyoko "n" "s" ichiA ichiB Psyakudo "c" "y" sel_list6 "y" "d" "n" "y" "y" ));(PLOT)
(command "_undon" "e" "u");(undo)UNDO開始点(BE)からの操作を取り消す
(setvar "CMDECHO" 1)
(princ)

);ModelPrint_2
(princ)

(defun *error* (msg)
(setvar "CMDECHO" 1)
(setvar "OSMODE" osm);オブジェクトスナップモードを元に戻す
(setq osm nil)
(princ "エラー: ")
(princ msg)
(princ)
)
(princ)

ここまでが ModelPrint.lsp です。
記事編集 編集
Re: モデルタブでの簡易印刷
投稿日 : 2019/09/16(Mon) 14:50
投稿者 だい
参照先
↓ダイアログを使うので、こちらを ModelPrint.dcl として保存して下さい。


/* ModelPrint.dcl - dcl file for ModelPrint.lsp program */

ModelPrint :dialog
{
label = "ModelPrint";
:column /* タイルを縦並びに配置スタート */
{
:boxed_column
{
label = "用紙設定";
:popup_list /* 編集ボックス処理タイルスタート */
{
label = "用紙サイズ ";
key = "list0";
width = 10;
} /* 編集ボックス処理タイル終了 */

:popup_list /* 編集ボックス処理タイルスタート */
{
label = "用紙方向 ";
key = "list1";
} /* 編集ボックス処理タイル終了 */

:popup_list /* 編集ボックス処理タイルスタート */
{
label = "印刷縮尺 = 1 :";
key = "list2";
width = 10;
} /* 編集ボックス処理タイル終了 */

}

:spacer{}
:boxed_column
{
label = "図面設定";
:popup_list /* 編集ボックス処理タイルスタート */
{
label = "作図単位 ";
key = "list3";
width = 10;
} /* 編集ボックス処理タイル終了 */

:popup_list /* 編集ボックス処理タイルスタート */
{
label = "図面縮尺 = 1 :";
key = "list4";
width = 22;
} /* 編集ボックス処理タイル終了 */
}


:spacer{}

:text_part
{
label = "印刷デバイス選択";
}

:popup_list
{
label = "";
key = "list5";
}

:spacer{}
:text_part
{
label = "印刷スタイル選択";
}

:popup_list
{
label = "";
key = "list6";
}

}// タイルを縦並びに配置終了

:row // タイルを横並びに配置スタート
{
:toggle
{
label = "縮尺表記";
key = "Wscale";
}

:popup_list
{
label = " 印刷部数";
key = "list7";
width = 7;
}
}

/* OK or CANCEL */
spacer;
//ok_cancel;
:row
{
: button
{
label = "印刷範囲指示";
is_default = true;
key = "accept";
width = 12;
fixed_width = true;
}

: button
{
label = "終了";
is_cancel = true;
key = "Cancel";
width = 4;
fixed_width = true;
}
}

}
記事編集 編集
Re: モデルタブでの簡易印刷
投稿日 : 2019/09/18(Wed) 17:30
投稿者 だい
参照先
書き忘れましたが、用紙サイズはLISPの63行目でA4,A3,A2,A1に限定しています。
この用紙名は239行目で印刷コマンドを実行させる際に使用しているので、
使用するプリンタの環境によっては用紙名の違いによってエラー(“無効な文字列値です。”と表示)になります。
その場合は以下の箇所を修正して下さい。

63行目
(setq list0_data (list "A4" "A3" "A2" "A1"))

166〜169行目
(cond
((= sel_list0 "A4")(setq width "0.210")(setq height "0.297"))
((= sel_list0 "A3")(setq width "0.297")(setq height "0.420"))
((= sel_list0 "A2")(setq width "0.420")(setq height "0.594"))
((= sel_list0 "A1")(setq width "0.594")(setq height "0.841"))
);cond
記事編集 編集
ページの上に移動
件名 スレッドをトップへソート
名前
メールアドレス
URL
暗証キー
画像認証 (右画像の数字を入力) 投稿キー
コメント


- WEB PATIO -