この掲示板は AutoCADマクロ屋本舗 の掲示板です。

【 注意 】最初に必ず ↓↓ 下記内容 ↓↓ を参照ください。
① マクロが分からない方は、まず 【 マクロ講座 】 を参照ください。
② 質問の前に 【 マクロ使用前の注意事項 】 をお読みください。
③ 質問する時は、新規投稿フォーム下の【 新規投稿時のお願い 】を必ずお読みください。

異尺度対応引出線があるとLispが止まってしまう
いつもこちらで勉強させていただいております。
マルチ引出線の高さを尺度変更した時に尺度に合せて変更するためのLispを書いております。
普段は異尺度未対応でマルチ引出線を書いておりますがたまにその中に異尺度対応の引出線が書かれいる時があります。
混在しているとコマンドが途中で止まってしまい何も変更されずに終わってしまいます。
これを回避するため
①異尺度対応マルチ引出線も変更可能にする
②コマンドが止まらずに最後まで流れて異尺度未対応のマルチ引出線のみ変更可能にする
できれば①を希望しますが(色々調べましたが私には難しかったです)②でも可能であればご教授よろしくお願いします。

使用CAD:AutoCAD2025、2024 LT2025


Lisp:
(defun c:MLIOK ( / point1 point2 ss2 ss_tm ss_ML ename DMObj DMHeight NewTxtheight OLDTXT OldSCALE )
(setq SCALE (getstring "新規設定する尺度 →1/")) ; 新規尺度を入力
(setq point1 (getpoint "対象となるオブジェクトを含んだ対角1点目を指示"))
(setq point2 (getcorner point1 "\n対象となるオブジェクトを含んだ対角2点目を指示"))
(setq ss2 (ssget "w" point1 point2))
(command "pselect" ss2 "" )
(setq ss_ML (ssget "_P" '((0 . "*LEADER"))))

(setq i 0)
(if ss_ML;図面内既存マルチ引出線文字を尺度に合せて高さ、全体尺度を変更
(repeat (sslength ss_ML)
(setq ename (ssname ss_ML i))
(setq i (1+ i))
(vla-put-ArrowheadSize (vlax-ename->vla-object ename) 3)
(vla-put-ScaleFactor (vlax-ename->vla-object ename) (atof SCALE))
(vla-put-TextHeight (vlax-ename->vla-object ename) 8)
(vla-put-Layer (vlax-ename->vla-object ename) "MOJI")
)
)

(princ));defun



コマンド: MLIOK
新規設定する尺度 →1/5
対象となるオブジェクトを含んだ対角1点目を指示
対象となるオブジェクトを含んだ対角2点目を指示pselect
オブジェクトを選択: 認識された数: 2
オブジェクトを選択:
コマンド: ._UNDO 現在の設定: 自動 = オン, コントロール = すべて, 合成 = はい, 画層 = はい
取り消す操作の数を入力 または [自動(A)/コントロール(C)/開始(BE)/終了(E)/マーク(M)/後退(B)] <1>: _E ._UNDO 現在の設定: 自動 = オン, コントロール = すべて, 合成 = はい, 画層 = はい
取り消す操作の数を入力 または [自動(A)/コントロール(C)/開始(BE)/終了(E)/マーク(M)/後退(B)] <1>: 1 MLIOK グループ ***MyERR***: オートメーション エラー。実行コンテキストが無効です



長くなってしまいましたがよろしくお願いします。
  • mappy
  • 2024/12/20 (Fri) 10:40:33
Re: 異尺度対応引出線があるとLispが止まってしまう
①は難しいと思います。
新規設定する尺度が注釈尺度リストにあるかどうか、なければ作成という手順が必要になります。
②なら、異尺度対応のフラグはVLISPで調べられないようなので、DXFコードの2つ目の293を調べて、それが1なら異尺度対応みたいです。

repeat以下をこんな感じにすれば、異尺度対応のものはスルーできるはず

(repeat (sslength ss_ML)
(setq ename (ssname ss_ML i))
(setq i (1+ i))
(if (/= 1 (cdr (assoc 293 (reverse (entget ename)))))
(progn
(vla-put-ArrowheadSize (vlax-ename->vla-object ename) 3)
(vla-put-ScaleFactor (vlax-ename->vla-object ename) (atof SCALE))
(vla-put-TextHeight (vlax-ename->vla-object ename) 8)
(vla-put-Layer (vlax-ename->vla-object ename) "MOJI")
)
)
)

  • LUNE
  • 2024/12/20 (Fri) 14:11:03
Re: 異尺度対応引出線があるとLispが止まってしまう
こちらに、異尺度対応ありのマルチ引出線を選択して、関連付けられている注釈尺度をすべて返すLispがありました。

https://www.cadtutor.net/forum/topic/59634-extract-mleader-annotative-properties/#google_vignette
  • LUNE
  • 2024/12/20 (Fri) 15:30:29
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様
返信ありがとうございます。

今日は時間が無いので来週早々やってみます。
ありがとうございます。

異尺度対応のものをスルーして
その後異尺度対応のもののみを選択して異尺度未対応に変更すればできそうですね
  • mappy
  • 2024/12/20 (Fri) 17:05:33
Re: 異尺度対応引出線があるとLispが止まってしまう
UNE様
遅くなってしまい申し訳ありません。

上記のLispで異尺度対応マルチ引出線も変更できたのですが、選択外の図面内全ての異尺度対応のマルチ引出線まで変わってしまいました。
とりあえずできたことに感動しました。

ありがとうございました。
  • mappy
  • 2024/12/24 (Tue) 11:44:41
Re: 異尺度対応引出線があるとLispが止まってしまう
>選択外の図面内全ての異尺度対応のマルチ引出線まで変わってしまいました。
それは、選択セットの作成方法に何か問題があるのではないでしょうか。
  • LUNE
  • 2024/12/24 (Tue) 13:01:35
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様

選択セットの設定はこの様になっております。
前回のLisp内容は問題のところのみを抽出したものになります。
実際は下記のLispとなります。
選択の部分のみ取り出しましたがこれでよろしいでしょうか?
この中の"*LEADER"箇所のみ選択外も変更されてしまいました。

(setq point1 (getpoint "対象となるオブジェクトを含んだ対角1点目を指示"))
(setq point2 (getcorner point1 "\n対象となるオブジェクトを含んだ対角2点目を指示"))
(setq ss2 (ssget "w" point1 point2))
(command "pselect" ss2 "" )
(setq ss_tm (ssget "_P" '((0 . "TEXT,MTEXT"))))
(command "pselect" ss2 "" )
(setq ss_t (ssget "_P" '((0 . "TEXT"))))
(command "pselect" ss2 "" )
(setq ss_BO (ssget "_P" '((2 . "オリエンテーションNo"))))
(command "pselect" ss2 "" )
(setq ss_BI (ssget "_P" '((2 . "相番3文字以上の時"))))
(command "pselect" ss2 "" )
(setq ss_ML (ssget "_P" '((0 . "*LEADER"))))
(command "pselect" ss2 "" )
(setq ss_SyRE (ssget "_P" '((8 . "Symbol,REVISION"))))
  • mappy
  • 2024/12/25 (Wed) 09:08:38
Re: 異尺度対応引出線があるとLispが止まってしまう
>この中の"*LEADER"箇所のみ選択外も変更されてしまいました。
>選択外の図面内全ての異尺度対応のマルチ引出線まで変わってしまいました。
これは、point1 point2で窓選択された範囲外の、異尺度対応のマルチ引出線が返事されたということですか?
私の書いたコードは、異尺度対応のものはスルーするはずなんですが、異尺度対応の引出線に何らかの変更がされますか?
  • LUNE
  • 2024/12/25 (Wed) 10:15:13
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様

>これは、point1 point2で窓選択された範囲外の、異尺度対応のマルチ引出線が返事されたということですか?
はい、そういう意味です。

>私の書いたコードは、異尺度対応のものはスルーするはずなんですが、異尺度対応の引出線に何らかの変更がされますか?
異尺度未対応マルチ引出線に対して変更命令しているもの全てに変更あります。
異尺度対応マルチ引出線には全体尺度0 異尺度対応の尺度に命令通りの尺度、高さが付き矢印の大きさも変更されております。



以下それぞれの変更命令文です。

(setq i 0)
(if ss_tm;ダイナミックテキスト・マルチテキスト 異尺度対応・異尺度未対応両方に対応
(repeat (sslength ss_tm)
(setq ename (ssname ss_tm i))
(setq i (1+ i))
(vla-put-Layer (vlax-ename->vla-object ename) "MOJI")
(setq DMObj (vlax-ename->vla-object ename));現在設定されている文字高さを取得する前準備
(setq DMHeight (vla-get-Height DMObj));現在設定されているHeightを取得
(cond
((= OLDTXT (/ DMHeight (atof OldSCALE))) (setq NewTxtheight OLDTXT))
(T (setq NewTxtheight (/ DMHeight (atof OldSCALE))))
);cond
(command "_SCALETEXT" ename "" "e" (* (atof SCALE) NewTxtheight));ダイナミック文字高さ変更
(command "_SCALETEXT" ename "" "e" "p" NewTxtheight);マルチテキスト文字高さ変更
)
)
(setq i 0)
(if ss_t;ダイナミックテキスト 
(repeat (sslength ss_t)
(setq ename (ssname ss_t i))
(setq i (1+ i))
(vla-put-ScaleFactor (vlax-ename->vla-object ename) 0.9)
)
);if


(setq i 0)
(if ss_BO;ブロック オリエンテーションNo 尺度に合せて変更
(repeat (sslength ss_BO)
(setq ename (ssname ss_BO i))
(setq i (1+ i))
(vla-put-XScaleFactor (vlax-ename->vla-object ename) SCALE)
);if
)


(setq i 0)
(if ss_BI;ブロック 相番 3文字以上 尺度に合せて変更
(repeat (sslength ss_BI)
(setq ename (ssname ss_BI i))
(setq i (1+ i))
(vla-put-XScaleFactor (vlax-ename->vla-object ename) (* (atof SCALE) 1.2))
);if
)

(setq i 0);図面内既存マルチ引出線文字を尺度に合せて高さ、全体尺度を変更 異尺度未対応
(if ss_ML
(repeat (sslength ss_ML)
(setq ename (ssname ss_ML i))
(setq i (1+ i))
(if (/= 1 (cdr (assoc 293 (reverse (entget ename)))))
(progn
(vla-put-ArrowheadSize (vlax-ename->vla-object ename) DIMARROW)
(vla-put-ScaleFactor (vlax-ename->vla-object ename) (atof SCALE))
(vla-put-TextHeight (vlax-ename->vla-object ename) TxtHeight)
(vla-put-Layer (vlax-ename->vla-object ename) "MOJI")
);progn
);if
);repeat
);if


(setq i 0);画層"Symbol""REVISION"をアクティブ図面の尺度に合せて尺度を変更
(if ss_SyRE
(repeat (sslength ss_SyRE)
(setq ename (ssname ss_SyRE i))
(setq i (1+ i))
(setq VlObj (vlax-ename->vla-object ename));現在のXScaleを取得する前準備
(setq XSNm (vla-get-XScaleFactor VlObj));現在のXScaleを取得
(vla-put-XScaleFactor (vlax-ename->vla-object ename) (* XSNm (/ (atof SCALE) (atof OldSCALE))));新規尺度のXScaleに変更
)
)






  • mappy
  • 2024/12/25 (Wed) 14:00:06
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様

できれば異尺度対応マルチ引出線も選択範囲内のものは変更したいです。
  • mappy
  • 2024/12/25 (Wed) 14:01:46
Re: 異尺度対応引出線があるとLispが止まってしまう
*LEADERの処理については、選択セットss_MLを対象にしてるなら、それ以外が処理されるのはおかしいですね・・・
  • LUNE
  • 2024/12/25 (Wed) 14:04:12
Re: 異尺度対応引出線があるとLispが止まってしまう
ですよね

諦めます。

お忙しい中色々とありがとうございました。
  • mappy
  • 2024/12/25 (Wed) 15:48:59
Re: 異尺度対応引出線があるとLispが止まってしまう
ちなみに、SymbolかREVISIONの画層に引出線があるってことはないですよね?
お示しいただいたコードを見ると、選択セットss_SyREは、画層名だけでフィルタしているので、その画層にあるテキストや引出線、ブロックは重複してScale変更されますが、問題ないのでしょうか?
  • LUNE
  • 2024/12/25 (Wed) 16:41:47
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様

確認したところSymbolにもREVISIONにも引出線付きのものはありませんでした。
  • mappy
  • 2024/12/25 (Wed) 17:09:42
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様

中途半端なLispの中身を見ていただいていても失礼かと思うので長くなってしまいますが全ての内容をアップいたします。
自宅に戻ってきてしまいましたのでアップは明日になりますがよろしくお願いします。
また、symbolとrevisionレイヤーのブロックも画像でアップいたします。(自分の認識していないところで引き出し線あるかもしれないと思いましたので)

長くなってしまいますがよろしくお願いいたします。
  • mappy
  • 2024/12/25 (Wed) 18:30:09
Re: 異尺度対応引出線があるとLispが止まってしまう
できれば、変更されてしまう引出線のデータもいただけないでしょうか。
窓指定している範囲内のものと、その外側で変更されるものと、どちらも数個ずつ(どちらにも異尺度対応・非対応があると助かります)で結構です。文字の中身も変えてもらって構いません。
  • LUNE
  • 2024/12/26 (Thu) 09:09:51
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様
遅くなりました

以下Lisp内容です。



(defun c:DrowStart(/ SCALE LINEGAP TxtHeight DIMARROW selectAB selects ss1 ZS XY str_date point1 point2 MTxtHeight ename ss2 dict MLeaderDict MLeaderStyleObj CM DY VlObj XSNm OldSCALE CANNOSCALE DMObj MsObj MsNm ss_t ss_tm OLDTXT ss_BO ss_BI ss_ML ss_SyRE )
(MyerrorStart)
(setvar "MEASUREMENT" 1 );現在の図面で使用する線種ファイルを”メートル”に設定
(setvar "EXPERT" 3 );LINETYPE[線種設定]コマンドのプロンプト非表示
(setq OLDTXT (getvar "DIMTXT"));寸法文字高さ取得
;作成日取得
(setq str_date (rtos (getvar "CDATE")))
(setq str_date (strcat
(substr str_date 1 4) ; 西暦年
"/"
(substr str_date 5 2) ; 月
"/"
(substr str_date 7 2) ; 日
)
)

;;■図面サイズA1 or A2 選択
(setq selectAB (getstring "\nA1 《ESC》で終了\n[<A1>(A)/A2(B)] 《ESC》で終了 "))

;;■ファイル内図面複数枚or1枚選択
(setq selects (getstring "\n1枚の時 《ESC》で終了\n[<1枚>(C)/複数枚(D)] 《ESC》で終了 "))

;;■尺度選択
(setq SCALE (getstring "新規設定する尺度(使用可能尺度:1,2,2.5,3,4,5,6,7.5,10,15,20,25,30,40,50,60,75,80,100,125,150,200)→1/")) ; 新規尺度を入力
;(scalesettei)
(setq DN (strcat "ACM-" SCALE));寸法スタイル用に文字列結合
(setq ZS (strcat "1/" SCALE));図面尺度用に文字列結合
(DstyleNew DN);尺度に合せた新規寸法スタイル名作成


;;■図面サイズ別文字高さ・線種尺度など各既定値設定
(DIMTHLTS)

;;■対象オブジェクト選択
(setq point1 (getpoint "対象となるオブジェクトを含んだ対角1点目を指示"))
(setq point2 (getcorner point1 "\n対象となるオブジェクトを含んだ対角2点目を指示"))
(setq ss1 (ssget "w" point1 point2 ))


;;■図面枠表題の尺度、作図日、製図者名書換え
(command "-attedit" "y" "*" "図面尺度" "*" "w" point1 point2 "v" "r" ZS "" );表題の尺度を新規尺度に書換え
(command "_attedit" "y" "*" "作図開始日" "*" "w" point1 point2 "v" "r" str_date "" )


;;■ファイル内図面複数枚or1枚選択 C=1枚
(if (= selects "C" );ファイル内に図面1枚の時
(progn
(setvar "LTSCALE" LINEGAP );線種尺度を尺度に合わせて設定
(setq OldSCALE (getvar "CANNOSCALE"));現在の注釈尺度取得
(setvar "CANNOSCALE" SCALE);新しい注釈尺度を設定
);progn
(progn;複数枚の時
(setq OldSCALE (getvar "DIMSCALE"));現在の注釈尺度取得
(setq OldSCALE (getstring (strcat "変更前の尺度⇒ 1/"(rtos OldSCALE)" ? ※必ず実数を手入力してください:"))) ;
(command "-OBJECTSCALE" ss1 "" "a" SCALE "");異尺度対応オブジェクトに新しい異尺度を追加
);progn
);if


;;■以下から共通
(DTMBchange);;■ダイナミック文字・マルチテキスト・マルチ引出線・シンボルブロック・スタンダード文字基本設定 尺度に合せて変更
(MLstandard);;■マルチ引出線スタイル"standard"をアクティブ図面の尺度に合せて高さ、全体尺度を変更
(setvar "DIMSCALE" (atof SCALE));寸法の全体尺度を変更 atof:文字列を実数に変換
(command "DIMTXT" TxtHeight);寸法文字高さを尺度に合わせて設定
(command "DIMASZ" DIMARROW);寸法・引出線矢印サイズを尺度に合わせて設定
(command "-DIMSTYLE" "s" DN "y" );寸法スタイル(ACM-●)に登録
(command "-DIMSTYLE" "a" ss1 "" );登録したスタイルを寸法に適用させる
(command "mleaderscale" SCALE );アクティブ図面のマルチ引出線尺度の変更 マルチ引出線スタイル”standard”
(command "_dimdisassociate" "all" "" );自動調整寸法解除
(command "_LINETYPE" "L" "*" "acadiso" "");全線種再読み込み
(command "REGEN" )
;;■余分な注釈尺度を削除
(if (= selects "C" );ファイル内に図面1枚の時
(command "-OBJECTSCALE" ss1 "" "d" OldSCALE "");余分な注釈尺度を削除
(command "-OBJECTSCALE" ss1 "" "d" OldSCALE "?" );余分な注釈尺度を削除
);if
(MyerrorEND)
(princ )
)





(defun MstyleHeight_DIMScale (DN )
(if (null (tblsearch "style" DN ))
(command-s "._STYLE"
DN ;文字スタイル名
"simplex8.shx,extfont2.shx" ;フォント名
(* TxtHeight (atof SCALE)) ;文字高さ
"0.9" ;幅係数
"0" ;傾斜角度
"N" ;左右反転
"N" ;上下反転
"N" ;縦書き
) ;command-s
);if
(princ));defun




(defun DTMBchange (/ )
;;■図面内既存ダイナミック・マルチ文字を尺度に合せて変更、新規尺度で文字スタイル作成
(vl-load-com)
(MstyleHeight_DIMScale DN);新規尺度での文字スタイル無かったら作成、あればスルー
(setvar "TEXTSTYLE" DN);新規尺度での文字スタイルを現在に設定
;;■既存文字を新規文字スタイルへ
(princ"\n既存文字を新規文字スタイルへ《ESC》で終了")
(setq ss2 (ssget "w" point1 point2))
(command "pselect" ss2 "" )
(setq ss_tm (ssget "_P" '((0 . "TEXT,MTEXT"))))
(command "pselect" ss2 "" )
(setq ss_t (ssget "_P" '((0 . "TEXT"))))
(command "pselect" ss2 "" )
(setq ss_BO (ssget "_P" '((2 . "オリエンテーションNo"))))
(command "pselect" ss2 "" )
(setq ss_BI (ssget "_P" '((2 . "相番3文字以上の時"))))
(command "pselect" ss2 "" )
(setq ss_ML (ssget "_P" '((0 . "*LEADER"))))
(command "pselect" ss2 "" )
(setq ss_SyRE (ssget "_P" '((8 . "Symbol,REVISION"))))

(setq i 0)
(if ss_tm;ダイナミックテキスト・マルチテキスト 異尺度対応・異尺度未対応両方に対応
(repeat (sslength ss_tm)
(setq ename (ssname ss_tm i))
(setq i (1+ i))
(vla-put-Layer (vlax-ename->vla-object ename) "MOJI")
(setq DMObj (vlax-ename->vla-object ename));現在設定されている文字高さを取得する前準備
(setq DMHeight (vla-get-Height DMObj));現在設定されているHeightを取得
(cond
((= OLDTXT (/ DMHeight (atof OldSCALE))) (setq NewTxtheight OLDTXT))
(T (setq NewTxtheight (/ DMHeight (atof OldSCALE))))
);cond
(command "_SCALETEXT" ename "" "e" (* (atof SCALE) NewTxtheight));ダイナミック文字高さ変更
(command "_SCALETEXT" ename "" "e" "p" NewTxtheight);マルチテキスト文字高さ変更
)
)
(setq i 0)
(if ss_t;ダイナミックテキスト 異尺度対応・異尺度未対応両方に対応
(repeat (sslength ss_t)
(setq ename (ssname ss_t i))
(setq i (1+ i))
(vla-put-ScaleFactor (vlax-ename->vla-object ename) 0.9)
)
);if


(setq i 0)
(if ss_BO;ブロック オリエンテーションNo 尺度に合せて変更
(repeat (sslength ss_BO)
(setq ename (ssname ss_BO i))
(setq i (1+ i))
(vla-put-XScaleFactor (vlax-ename->vla-object ename) SCALE)
);if
)


(setq i 0)
(if ss_BI;ブロック 相番 3文字以上 尺度に合せて変更
(repeat (sslength ss_BI)
(setq ename (ssname ss_BI i))
(setq i (1+ i))
(vla-put-XScaleFactor (vlax-ename->vla-object ename) (* (atof SCALE) 1.2))
);if
)

(setq i 0);図面内既存マルチ引出線文字を尺度に合せて高さ、全体尺度を変更 異尺度未対応
(if ss_ML
(repeat (sslength ss_ML)
(setq ename (ssname ss_ML i))
(setq i (1+ i))
(if (/= 1 (cdr (assoc 293 (reverse (entget ename)))))
(progn
(vla-put-ArrowheadSize (vlax-ename->vla-object ename) DIMARROW)
(vla-put-ScaleFactor (vlax-ename->vla-object ename) (atof SCALE))
(vla-put-TextHeight (vlax-ename->vla-object ename) TxtHeight)
(vla-put-Layer (vlax-ename->vla-object ename) "MOJI")
);progn
);if
);repeat
);if


(setq i 0);画層"Symbol""REVISION"をアクティブ図面の尺度に合せて尺度を変更
(if ss_SyRE
(repeat (sslength ss_SyRE)
(setq ename (ssname ss_SyRE i))
(setq i (1+ i))
(setq VlObj (vlax-ename->vla-object ename));現在のXScaleを取得する前準備
(setq XSNm (vla-get-XScaleFactor VlObj));現在のXScaleを取得
(vla-put-XScaleFactor (vlax-ename->vla-object ename) (* XSNm (/ (atof SCALE) (atof OldSCALE))));新規尺度のXScaleに変更
)
)

(princ )
)




(defun MLstandard (/ )
;;■マルチ引出線スタイル"standard"をアクティブ図面の尺度に合せて高さ、全体尺度を変更
(vl-load-com)
(vlax-for dict (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object)))
(if (and (vlax-property-available-p dict 'name)
(= (vla-get-name dict) "ACAD_MLEADERSTYLE")
)
(setq MLeaderDict dict)))

;名前が"Standard"であるMLeaderStyleを取得
(vlax-for itm MLeaderDict
(if (= (vla-get-name itm) "Standard")
(setq MLeaderStyleObj itm)))

;引出線スタイル "standard" の全体尺度と文字高さ尺度に合せて変更
(if MLeaderStyleObj
(progn
;矢印のサイズ(Z) 
(vla-put-ArrowSize MLeaderStyleObj DIMARROW)
;尺度(E)
(vla-put-ScaleFactor MLeaderStyleObj SCALE)
;文字の高さ
(vla-put-TextHeight MLeaderStyleObj MTxtHeight)
)
)
(princ )
)






  • mappy
  • 2024/12/26 (Thu) 12:17:58
Re: 異尺度対応引出線があるとLispが止まってしまう
ファイル内右側の赤枠の中を変更しようとしています。

https://drive.google.com/file/d/1oIrkLUujXRjqEo5FknPMObEqxR-LJWiN/view?usp=sharing

これでDLできますでしょうか?
  • mappy
  • 2024/12/26 (Thu) 12:25:08
Re: 異尺度対応引出線があるとLispが止まってしまう
  • mappy
  • 2024/12/26 (Thu) 12:28:56
Re: 異尺度対応引出線があるとLispが止まってしまう
TEST4のリンクが失敗しているかもしれないので再度投稿します。

https://drive.google.com/file/d/1oIrkLUujXRjqEo5FknPMObEqxR-LJWiN/view?usp=sharing
  • mappy
  • 2024/12/26 (Thu) 12:31:17
Re: 異尺度対応引出線があるとLispが止まってしまう
データ受領しました。TEST4のリンクも大丈夫でした。
(ただ、公開しておくにはちょっと問題があると思うので、早々にリンクを無効にされることをお薦めします。)

大作なLispなので、検証に年明けまでお時間ください・・・
  • LUNE
  • 2024/12/26 (Thu) 13:16:28
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様

お気遣いありがとうございます。
リンク切りました。

承知いたしました。
よろしくお願いします。
  • mappy
  • 2024/12/26 (Thu) 14:46:38
Re: 異尺度対応引出線があるとLispが止まってしまう
マルチ引出線の異尺度対応、未対応が範囲外で変更されてしまう件については、なんとなく原因がわかりましたが、もうちょっと検証します。

ざっとLispを実行してみましたが、気になるところが数点あります。
このLispは1つのファイル内で、選択範囲内を処理しようとしていることから、縮尺の異なる図面を作成するために考えられたのだと推測します。
ただ、そうなると問題点がいくつかあります。

まず、大きなところは、現在問題になっているマルチ引出線の変更方法にも関わります。
原則として、「スタイル」のあるものは、適用するスタイルをその尺度にあったものに変更する、個々のオブジェクトで尺度変更などをすることは望ましくありません。
理由は、同じスタイルで高さなどの設定が別々になってしまうためです。
Lisp中で尺度に合わせた文字スタイルを作成されているようなので、選択範囲内の文字を個々に高さ変更するのではなく、文字スタイルを変更するほうがいいと思います。

また、寸法やマルチ引出線のスタイルは「尺度」によって文字やシンボルのサイズをサイズ変更するので、基本的に尺度を合わせれは、文字・矢印のサイズも変更されます。今のように尺度も矢印のサイズも、文字サイズも変更してしまっては、元になるスタイルと整合が取れません。
今回の最初に提示されたマルチ引出線のコードでは、矢印サイズ、尺度、文字のサイズすべてを変更しています。
それだと、尺度に対して大きくなりすぎませんか?
選択範囲内のマルチ引出線で変更すべきは、
(vla-put-ScaleFactor (vlax-ename->vla-object ename) (atof SCALE))
のコード1行だけだと思います。

範囲外の異尺度未対応マルチ引出線が変更されてしまうのは、サブルーチンで使用しているMLstandardが原因です。
コード内にも記述があるように
;引出線スタイル "standard" の全体尺度と文字高さ尺度に合せて変更
引出線スタイルそのものの尺度を変更しています。
そのため、範囲外の異尺度未対応のマルチ引出線もそのスタイルに従って変更されます。

(command "mleaderscale" SCALE )については、注意が必要かと。
これは、マルチ引出線の尺度を設定しますが、マルチ引出線スタイルの設定値と異なる場合、mleaderscaleが優先されます。(現在のスタイルの尺度には設定されません)
おそらく今のLispではどちらも同じ値になるのでしょうが・・・

いただいたデータでは、尺度ごとに寸法スタイルがあるようなので、マルチ引出線も尺度ごとにスタイルを与えた方がいいと思います。
そのあたりは、mappyさんの会社の方針にもよりますが・・・

その他、図面サイズや図面枚数をアルファベットで選択していますが、
(if (= selects "C" );ファイル内に図面1枚の時
このコードだと、cを小文字で入力されるとfalseになるので、
(if (= (strcase selects) "C" )
と、大文字に変換してから比較が必要です。

線種読み込みの下記コードですが、今のままだとすでに読み込まれている線種のところでエラーが出ませんか?
(command "_LINETYPE" "L" "*" "acadiso" "");全線種再読み込み


長々と書きましたが、いろんなことを盛り込まれたLispになっているので、個々でもう少し詰められたほうがいいと思います。
特に、スタイルを使うものに関しては、スタイルを変更するとそのスタイルの既定の設定を持つものは、範囲外であっても変更されます。マルチ引出線については、スタイル自体の変更は問題があるので、再考されたほうが良いかと。
扱いに困るのが、尺度がスタイルに沿っていないマルチ引出線です。スタイルを変更しても上書きされた尺度はそちらが優先されるようなので・・・


異尺度対応のオブジェクト(このLisp内では文字とマルチ引出線)については、結構検索したのですが、現在ファイル内にある尺度リストの取得方法がどうしても分かりませんでした。(今ある尺度リストを現在を除きすべて削除→欲しい尺度を追加、しかない・・・)
もうちょっと考えてみます。
  • LUNE
  • 2024/12/26 (Thu) 17:23:57
Re: 異尺度対応引出線があるとLispが止まってしまう
上記でも書きましたが、コード全体をほぼ見終わって、やはり範囲外のマルチ引出線が変更される件は、サブルーチンMLstandardが原因です。
マルチ引出線スタイルそのものを変更してしまうので、そのスタイルの既存のマルチ引出線すべてに影響してしまいます。

寸法スタイルや文字スタイルのように、縮尺別にスタイルを作成が必要で、今のままではマルチ引出線を縮尺に対応したサイズに変更することはできません。

それと、もう1つ気になったのが、文字サイズの変更です。
縮尺別に文字スタイルを用意されているようなのに、コード内ではスタイルを変更せずに大きさを変更しています。
(command "_SCALETEXT" ename "" "e" (* (atof SCALE) NewTxtheight));ダイナミック文字高さ変更
(command "_SCALETEXT" ename "" "e" "p" NewTxtheight);マルチテキスト文字高さ変更
コメントが付いていますが、この解釈は間違いです。
上段のコードは、ダイナミック、マルチテキストに関わらず、異尺度未対応文字の高さが変更されます。
下段のコードは、pオプションにより用紙上の高さを変更しています。これは異尺度対応文字の高さ変更となりますが、これを変更してしまうと最後に変更後の注釈尺度を与えた場合に、表示される大きさが意図したものと変わってしまいませんか?
異尺度対応文字は、文字の高さの変更は必要なく、注釈尺度だけを変更しなければなりません。(そもそもそれが異尺度対応の考え方なので・・・)

寸法に関しては、スタイルを適用する処理をしているので、文字もマルチ引出線も同じ対応をしてはいかがでしょう?

このあたりをクリアできれば、最初のマルチ引出線に対する異尺度対応・未対応への変更ができると思います。
  • LUNE
  • 2024/12/27 (Fri) 09:51:18
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様

>縮尺の異なる図面を作成するために考えられたのだと推測します。
はい、その通りで、例えば組図を作り、その横に尺度の違う製作図を書いてファイルは1枚でおさめたいからです。


>Lisp中で尺度に合わせた文字スタイルを作成されているようなので、選択範囲内の文字を個々に高さ変更するのではなく、文字スタイルを変更するほうがいいと思います。
休み明けに修正します。
ただ、その時に既定高さよりも高くした文字がどうなるのか・・・検証します。


>今回の最初に提示されたマルチ引出線のコードでは、矢印サイズ、尺度、文字のサイズすべてを変更しています。それだと、尺度に対して大きくなりすぎませんか?
とりあえずテストの時は大きくなっておりませんでした。
また、記入済みのマルチ引出線は変更されないため矢印、文字高さを選択範囲で変更しました。(←今の私の認識では)


>範囲外の異尺度未対応マルチ引出線が変更されてしまうのは、サブルーチンで使用しているMLstandardが原因です。
失礼いたしました。
;引出線スタイル "standard" の全体尺度と文字高さ尺度に合せて変更 こちらを削除します。


>(command "mleaderscale" SCALE )については、注意が必要かと。これは、マルチ引出線の尺度を設定しますが、マルチ引出線スタイルの設定値と異なる場合、mleaderscaleが優先されます。(現在のスタイルの尺度には設定されません)
マルチ引出線のスタイル作成をLispで行うことが検索してもわからなかったため、全てstandardで統一し、記入する時にアクティブの尺度に合わせるため"mleaderscale"を追記しました。どうしてもダイアログが立ち上がってしまうため。


>(if (= selects "C" );ファイル内に図面1枚の時
こちらに関してはツールパレットに登録して使うため、自動になっております。
大文字小文字の区別が必要だったんですねこのような細かい配慮までありがとうございます。


>線種読み込みの下記コードですが、今のままだとすでに読み込まれている線種のところでエラーが出ませんか?
エラー出たことありませんでした。
色々なデータを使っていると線のGAPというのでしょうか?1点鎖線などの間隔がおかしくなってしまうので必ず再度読み込み事にしているんです。
そもそもこの考え方がおかしいでしょうか?













  • mappy
  • 2024/12/27 (Fri) 16:19:07
Re: 異尺度対応引出線があるとLispが止まってしまう
LUNE様

>マルチ引出線スタイルそのものを変更してしまうので、そのスタイルの既存のマルチ引出線すべてに影響してしまいます。
確かに!その通りですね。早速削除しました。


>下段のコードは、pオプションにより用紙上の高さを変更しています。これは異尺度対応文字の高さ変更となりますが、これを変更してしまうと最後に変更後の注釈尺度を与えた場合に、表示される大きさが意図したものと変わってしまいませんか?
変わります。なぜか原因わからず悩みました。



>異尺度対応文字は、文字の高さの変更は必要なく、注釈尺度だけを変更しなければなりません。(そもそもそれが異尺度対応の考え方なので・・・)
そうなんですね。
それならなぜ"p"用紙上の文字の高さという選択項目があるのでしょうか???謎です。


>文字もマルチ引出線も同じ対応をしてはいかがでしょう?
マルチ引出線のスタイル設定がLisp内でできずにstandardの尺度を変更するようにしてしまいました。
記入済みのマルチ引出線には影響がないので大丈夫だろうと思ってしまいました。


AutoCADのことがわかっていないため、色々と間違ったやり方をやっていたと思います。
恥ずかしいLisp内容ですが、細かいところまで見ていただきありがとうございました。(間違った解釈、記入などありかなり大変だったと思います)

来年もう一度ご指摘いただいた箇所を見直してみます。
  • mappy
  • 2024/12/27 (Fri) 16:29:15

返信フォーム






プレビュー (投稿前に内容を確認)