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

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

拡張分解の『親ブロックから継承』について
はじめまして。お世話になります。
直接マクロに関する質問ではないのですが、自作のマクロ等で狙った動作が得られないので質問させてください。

画層0、色・線種・太さをbyblockで作成した線分をブロック化し、そのブロックを画層1、色red、線種center、太さ1.0mmに設定したとします。
これをxplodeの『親ブロックから継承』で分解すると、画層1、色red、線種byblock、太さbyblockの線分になるのですが、これは仕様でしょうか。
画層1、色red、線種center、太さ1.0mmの線分に分解してほしいのですが…
burstコマンドも試しましたが、同じく線種・太さはbyblockになってしまいます。
システム変数等調べましたが分かりませんでした。
複数個のブロックを一度に分解するので、他オプションの『すべて』『色』等は使用せず、『親ブロックから継承』で処理したいのですが、無理でしょうか。
無理な場合、LISPで作成できますでしょうか。

使用バージョンは、LT2017と2021Rです。

よろしくお願いいたします。

  • いとう
  • 2023/05/26 (Fri) 10:54:38
Re: 拡張分解の『親ブロックから継承』について
私も自分の環境で試してみましたが(R2018、R2021、R2022)、同じように画層と色しか引き継ぎませんでした。
以前は全部引き継いでいたような気がするのですが・・・

ちょっと気になったので、DESKのサポートに質問してみます。

  • LUNE
  • 2023/05/26 (Fri) 16:28:25
Re: 拡張分解の『親ブロックから継承』について
解決はお任せするとして

応急処置で作ってみました(あくまで自己満足です)

*^C^C$M=setenv;to;0;$(nth,$(getenv,to),select;\copybase;non;0<0;p;;erase;p;;setenv;to;1,,,,,)$(nth,$(getenv,to),,-layout;d;tmplo2;;n;tmplo2;;s;tmplo2;point;0<0;erase;all;;-layout;d;tmplo1;;n;tmplo1;;s;tmplo1;point;0<0;erase;all;;pasteclip;non;0<0;setenv;to;2,,,,)$(nth,$(getenv,to),,,;to;5;select;l;;copybase;non;0<0;l;;erase;l;;-layout;s;tmplo2;pasteclip;non;0<0;zoom;e;setenv;to;3,,,)$(nth,$(getenv,to),,,,explode;l;pasteclip;non;0<0;matchprop;l;all;;erase;l;;copybase;non;0<0;all;;erase;all;;model;setenv;to;4,,)$(nth,$(getenv,to),,,,,pasteclip;non;0<0;-layout;s;tmplo1;setenv;to;2,)$(nth,$(getenv,to),,,,,,model;-layout;d;tmplo1;;d;tmplo2;^Csetenv;to;0)^M

1.マクロ起動
2.ブロック選択(複数可ただしブロックのみ)

以上です

※仮に『tmplo1』『tmplo2』の名前でレイアウトを使用しています
上記名前ですでに使用している場合にはマクロ内の同名称をすべて変更してください
また、数が多いとフリーズのような状態が続くと思います
  • chibi-tom
  • 2023/05/26 (Fri) 17:12:03
Re: 拡張分解の『親ブロックから継承』について
LUNE様

わざわざどうもありがとうございます。
よろしくお願いいたします。
  • いとう
  • 2023/05/29 (Mon) 09:08:53
Re: 拡張分解の『親ブロックから継承』について
chibi-tom様

素晴らしいマクロをありがとうございます。
すべて親ブロックから継承されました。

ただ、このマクロと同じくらい長いマクロに組み込みたい場合があるのですが、LISPでは無理でしょうか…
  • いとう
  • 2023/05/29 (Mon) 09:22:01
Re: 拡張分解の『親ブロックから継承』について
LISPでは無理でしょうか<LTしか使用したことが無いので
他の方にお任せします<m(__)m>

もし自分のマクロが参考になればわかる方ならすぐにでもできてしまうかもしれないですね
  • chibi-tom
  • 2023/05/29 (Mon) 09:24:26
Re: 拡張分解の『親ブロックから継承』について
chibi-tom様

すみません、どうもありがとうございました。
実は一番の目的は、chibi-tom様作成の全ブロック分解マクロをXPLODEの親継承でできないかなぁと思ってのことでして…
初めましてですが、いつもお世話になってました。
いつも素晴らしいマクロを本当にありがとうございます。
  • いとう
  • 2023/05/29 (Mon) 09:31:31
Re: 拡張分解の『親ブロックから継承』について
Lispだとこんな感じでしょうか。
コマンド名はxxp、ブロック内のオブジェクトで、O画層・ByBlockに設定されたプロパティのみ、ブロックに設定された画層・色・線種・線の太さを引き継ぎます。
--------------------------------------------------
(defun c:xxp (/ ss cnt i ename ent lay clr lt lw lastObj newent)
(setq ss (ssget '((0 . "INSERT"))))
(setq cnt (sslength ss))
(setq i 0)
(repeat cnt
(setq ename (ssname ss i))
(setq ent (entget ename))

(setq lay (cdr (assoc 8 ent))
clr (if (assoc 62 ent) (cdr (assoc 62 ent)) 256)
lt (if (assoc 6 ent) (cdr (assoc 6 ent)) "Bylayer")
lw (if (assoc 370 ent) (cdr (assoc 370 ent)) -1)
)

(setq lastObj (entlast))
(command-s "explode" ename "")
(while (setq lastObj (entnext lastObj))
(setq newent (entget lastObj))
(if (= (cdr (assoc 8 newent)) "0")
(progn
(setq newent (subst (cons 8 lay) (assoc 8 newent) newent))
(if (= (cdr(assoc 62 newent)) 0)
(setq newent (subst (cons 62 clr) (assoc 62 newent) newent))
)
(if (= (cdr(assoc 6 newent)) "ByBlock")
(setq newent (subst (cons 6 lt) (assoc 6 newent) newent))
)
(if (= (cdr(assoc 370 newent)) -2)
(setq newent (subst (cons 370 lw) (assoc 370 newent) newent))
)
)
)
(entmod newent)
)
(setq i (+ i 1))
(princ)
)
)
  • LUNE
  • 2023/05/29 (Mon) 13:43:42
Re: 拡張分解の『親ブロックから継承』について
LUNE様

LISP作成ありがとうございます。
使わせて頂いたのですが、ブロックを1個だけ選択した時はうまく動作するのですが、複数個選択した時(コマンド前に選択・コマンド後に選択ともに)も1個しか分解されませんでした。
申し訳ありませんが、お時間がある時で結構ですので、複数個分解できるようにお願いできますでしょうか。
  • いとう
  • 2023/05/29 (Mon) 15:11:55
Re: 拡張分解の『親ブロックから継承』について
すでに解決策記載済みですが書いたので供養…
VLAだとこんな感じということで。

(defun c:XBLO ( / sset i block objs obj)
(vl-load-com)
(setq sset (ssget '((0 . "INSERT")))
i 0
)
(repeat (sslength sset)
(setq block (vlax-ename->vla-object (ssname sset i)))
(setq objs (vla-explode block))
(foreach obj (vlax-safearray->list (vlax-variant-value objs))
(if (= 0 (vlax-get-property obj 'color))
(vlax-put-property obj 'color (vlax-get-property block 'color))
)
(if (= "0" (vlax-get-property obj 'layer))
(vlax-put-property obj 'layer (vlax-get-property block 'layer))
)
(if (= "ByBlock" (vlax-get-property obj 'linetype))
(vlax-put-property obj 'linetype (vlax-get-property block 'linetype))
)
(if (= -2 (vlax-get-property obj 'lineweight))
(vlax-put-property obj 'lineweight (vlax-get-property block 'lineweight))
)
);foreach
(vla-delete block)
(setq i (1+ i))
);repeat
(princ)
);defun
  • んぼ
  • 2023/05/29 (Mon) 15:12:44
Re: 拡張分解の『親ブロックから継承』について
すみません。
カウンタ変数をカウントアップできてませんでした。
上記掲載のコード修正したので、そちらでお試しください。
  • LUNE
  • 2023/05/29 (Mon) 15:18:41
Re: 拡張分解の『親ブロックから継承』について
LUNE様
んぼ様

できました!
希望通りに分解できました。
どうもありがとうございました。

レスを下さった皆様、素晴らしいマクロを本当にありがとうございました。
またお世話になるかと思いますが、その時はよろしくお願いいたします。
  • いとう
  • 2023/05/29 (Mon) 15:55:23
Re: 拡張分解の『親ブロックから継承』について
談話室のほうで、子や孫のブロックまでは分解されないとのことで
図面内の全部のブロックを分解だとこちらにありました。
https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/recursive-explode-lisp/td-p/5699939


拡張分解をするように少し追加するとこんな感じです。


(vl-load-com)
(defun c:XBLS (/ explodable adoc exp_lst not_explodable ss obj objs)

(defun explodable (ss / i lst name obj)
(repeat (setq i (sslength ss))
(setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))
name (vla-get-effectivename obj)
)
(if (and (not (vl-position name not_explodable))
(vlax-write-enabled-p obj)
)
(setq lst (cons obj lst))
)
)
lst
)

(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark adoc)
(vlax-for blk (vla-get-Blocks adoc)
(if (or (eq (vla-get-explodable blk) :vlax-false)
(eq (vla-get-isxref blk) :vlax-true)
)
(setq not_explodable (cons (vla-get-name blk) not_explodable))
)
)

(while (and (setq ss (ssget "_X" '((0 . "INSERT"))))
(setq exp_lst (explodable ss))
)
(foreach blk exp_lst
; (vla-explode blk)
; ここから追加部分
(setq objs (vla-explode blk))
(setq objs (vlax-safearray->list (vlax-variant-value objs)))
(foreach obj objs
(if (= 0 (vlax-get-property obj 'color))
(vlax-put-property obj 'color (vlax-get-property blk 'color))
)
(if (= "0" (vlax-get-property obj 'layer))
(vlax-put-property obj 'layer (vlax-get-property blk 'layer))
)
(if (= "ByBlock" (vlax-get-property obj 'linetype))
(vlax-put-property obj 'linetype (vlax-get-property blk 'linetype))
)
(if (= -2 (vlax-get-property obj 'lineweight))
(vlax-put-property obj 'lineweight (vlax-get-property blk 'lineweight))
)
)
; ここまで
(vla-delete blk)
);foreach
)
(vla-endundomark adoc)
(princ)
)

--------------------------
ブロックを選択させるとこんな感じ

(vl-load-com)
(defun c:XBLO (/ explodable adoc exp_lst not_explodable ss obj objs)

(defun explodable (ss / i lst name obj)
(repeat (setq i (sslength ss))
(setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))
name (vla-get-effectivename obj)
)
(if (and (not (vl-position name not_explodable))
(vlax-write-enabled-p obj)
)
(setq lst (cons obj lst))
)
)
lst
)

(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark adoc)
(vlax-for blk (vla-get-Blocks adoc)
(if (or (eq (vla-get-explodable blk) :vlax-false)
(eq (vla-get-isxref blk) :vlax-true)
)
(setq not_explodable (cons (vla-get-name blk) not_explodable))
)
)
(setq ss (ssget '((0 . "INSERT"))))
(while (and (> (sslength ss) 0) (setq exp_lst (explodable ss)))
(setq ss (ssadd))
(foreach blk exp_lst
(setq objs (vla-explode blk))
(setq objs (vlax-safearray->list (vlax-variant-value objs)))
(foreach obj objs
(if (= 0 (vlax-get-property obj 'color))
(vlax-put-property obj 'color (vlax-get-property blk 'color))
)
(if (= "0" (vlax-get-property obj 'layer))
(vlax-put-property obj 'layer (vlax-get-property blk 'layer))
)
(if (= "ByBlock" (vlax-get-property obj 'linetype))
(vlax-put-property obj 'linetype (vlax-get-property blk 'linetype))
)
(if (= -2 (vlax-get-property obj 'lineweight))
(vlax-put-property obj 'lineweight (vlax-get-property blk 'lineweight))
)
(if (= "AcDbBlockReference" (vla-get-ObjectName obj))
(ssadd (vlax-vla-object->ename obj) ss)
)
)
(vla-delete blk)
);foreach
)
(vla-endundomark adoc)
(princ)
)


  • んぼ
  • 2023/06/06 (Tue) 08:58:59
Re: 拡張分解の『親ブロックから継承』について
んぼ様

使わせていただきましたが、こちらだとクリップボード関連のプログラムを起動したままでもエラー等なく全ブロック分解することができました。
XBLS,XBLOともに状況に応じて使わせていただきます。
ありがとうございました。
  • いとう
  • 2023/06/06 (Tue) 14:30:12
Re: 拡張分解の『親ブロックから継承』について
Autodeskから回答がありました。

最新バージョンのAutoCAD2024でも同様の(線種と線の太さがbyblockとなる)現象が確認でき、製品の問題点である可能性があるため、開発チームに報告したとのことです。

設定云々の問題ではないようです。
  • LUNE
  • 2023/06/08 (Thu) 09:30:34
Re: 拡張分解の『親ブロックから継承』について
LUNE様

設定とかの問題ではなかったんですね。
私が気づいたのは2017ですが、結構長い間気付かれてなかったんですかね。
やはりマイナーなコマンドなんですね…

お問い合わせありがとうございました!
  • いとう
  • 2023/06/08 (Thu) 12:58:53
Re: 拡張分解の『親ブロックから継承』について
お世話になります。

使用CADがAUTOCAD2021からAUTOCAD2024になったのですが、上でLUNE様とんぼ様が作成してくださったLISPが使えなくなりました。
『エラー:オートメーションエラー。キーが見つかりません』
と出ます。
お時間があるときで結構ですので、2024でも使えるように修正していただけないでしょうか。
よろしくお願いいたします。
  • いとう
  • 2024/03/08 (Fri) 10:00:14
Re: 拡張分解の『親ブロックから継承』について
LISPがバージョン違いで使えないってことは、ほとんどないんですが・・・
コマンドを実行したデータで、
・ブロックがそもそもない
・ブロックがあるけど、分解禁止のものがある
・O画層・ByBlockに設定されたプロパティのものがない(本当はこれはなくてもちゃんと動くはず)
あたりの、コマンド実行でエラーになる何らかのオブジェクトがある、というケースしか考えつきません。
詳細なところは、デバッグしながらじゃないと、確かめるのは難しいかと。

簡単なテストデータを作成して、それで実行しても同じエラーが発生しますか?
  • LUNE
  • 2024/03/11 (Mon) 13:01:07
Re: 拡張分解の『親ブロックから継承』について
LUNE様

ご返信ありがとうございます。

データですが、
・ブロック→あります。
・分解禁止のもの→ありません。
・O画層・ByBlockに設定されたプロパティのもの→あります。

簡単なテストデータで実行したところ、エラーも出ずうまく分解できました。

少し複雑なデータ(普通の図面)ですと、LUNE様のLISPはうまく分解できましたが、んぼ様のLISPは配列複写がおかしなことになりました。(分解された配列複写のオブジェクトが別箇所に複写されました。簡単なデータでは複写されることなく分解できています。)

今回オートメーションエラーが発生した図面が2024で初めて拡張分解のLISPを使った図面でしたので2024になったことが原因かと思いましたが、図面自体に問題があるのでしょうか。
検証不足で申し訳ありませんでした。
  • いとう
  • 2024/03/11 (Mon) 14:29:41
Re: 拡張分解の『親ブロックから継承』について
もしかしたら、ブロックの中にブロックが含まれているケースがあるのかもしれません。
私のLISPは、単純なケースにしか想定していないので、複雑なブロックに対しては対応できないかもしれません。
  • LUNE
  • 2024/03/11 (Mon) 15:26:58
Re: 拡張分解の『親ブロックから継承』について
配列複写のグループコードは
(0 . "INSERT")
です。

そしてLISPでブロックを抽出して編集しようとすると、
配列複写が入り込んでしまい、エラーがよく出ます。

ですから、配列複写をフィルターアウトして処理すれば、エラーは出なくなるかもしれません。

  • 通りすがりの人
  • 2024/03/11 (Mon) 15:49:58
Re: 拡張分解の『親ブロックから継承』について
申し訳ありません、1つ間違えていました。
オートメーションエラーが出た図面ですが、LUNE様のLISPはオートメーションエラーは出ず、ダイナミックブロックの形が崩れて分解されていました。(他の図面では同じダイナミックブロックでもきれいに分解されます。)

LUNE様
ご返信ありがとうございます。
ブロックの中にブロックは含まれていますが、LISPを複数回実行することで分解できています。
特定の図面だけダイナミックブロックがうまく分解できないようです。
ダイナミックブロックの個数を増やしても減らしても図面によって結果が違いましたので、なにか個数以外に要因があるのだと思います。


通りすがりの人様
ご返信ありがとうございます。
配列複写を別途分解した後に実行してみましたが、エラーはまた出ました…。


御二方どうもありがとうございました。
2024ということは関係ないようですので、ややこしい図面は、クリップボード関係のアプリを終わらせてchibi-tom様のマクロを使わせていただくことにします。



  • いとう
  • 2024/03/11 (Mon) 16:41:59
Re: 拡張分解の『親ブロックから継承』について
元教務部長が2100万円横領か 小澤優

京都市内の専門学校で、部長をつとめていた60代の元教員が、学生が加入する同窓会組織の口座から少なくとも2100万円を着服したとして懲戒解雇されていたことがわかりました。
専門学校は近く、この元教員を刑事告発する方針です。

元教員による着服の疑いが明らかになったのは、京都市上京区にある、看護師や臨床検査技師を養成する「京都保健衛生専門学校」です。
専門学校によりますと、臨床検査学科の教務部長を務めていた60代の男性教員は、去年(令和4年)4月からことし3月にかけて、同窓会組織の口座から少なくとも2100万円を無断で引き出していたということです。
同窓会組織の口座には学生が支払った会費が積み立てられていますが、ことし5月ごろ、外部調査で、同窓会組織の口座から多額の引き出しがあることがわかったため、口座を管理していた元教員に説明を求めたところ、着服を認めたということです。
学校は元教員を先月(6月)27日に懲戒解雇処分にしたうえで、近く、警察に刑事告発する方針で、5日夜、学生や保護者に対して説明会を開き、こうした内容を明らかにしたということです。
京都保健衛生専門学校は「同窓会組織への支払いは、入学時に学校が窓口として関わっていて、管理責任があり、反省している。再発防止を徹底し、学生の授業などに影響がないようつとめたい」とコメントしています。

https://www.sankei.com/article/20230705-VUCIPM2QKJIANML6HNUSF3META/?outputType=amp
  • 匿名
  • 2024/03/15 (Fri) 08:00:32

返信フォーム






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