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

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

変数の前回入力値について
仕事でAutoCAD(LT)2019~2016と
AutoCAD酷似製品のIJCAD(STD)2018を使用しています。

AutoCADのカスタムコマンドはある程度作り終わったので
LISPにてIJCADをカスタムしていっているところです。

AutoCADでLISPを使用したことがないので教えて頂きたいのですが

IJCAD既存のコマンド使用時に数値を入力する際、
入力欄に既に前回入力値が入っていてドラックされており、
エンターすると前回の数値が再び使え、
新たに入力すると新たな数値にて実行されます(AutoCAD同様)

ですが、カスタムコマンドをLISPにて作成し
setqにて変数に値を入力する場合は毎回空白の状態になるのです。

変数のリセットは行っておらず
!変数にて値が入っているのも確認済みです。


AutoCADでのLISP使用時も同様なのでしょうか?

また、setq使用時に前回入力値を表示させる方法を
ご存じの方がいらっしゃいましたら教えて頂けないでしょうか。

よろしくお願い致します。
  • BIJIKENTY
  • 2021/06/08 (Tue) 19:54:05
Re: 変数の前回入力値について
どのプログラム言語でも同じですが、
そのルーチン(1つのLISPプログラム)の中で宣言された変数は、そのルーチンが終了した時点で自動でリセットされます。

なので、前回の入力値を覚えさせておくには、終了することなくループするように処理させるか、
レジストリに保存させたり、INIファイル(等の設定ファイル)を作成してそこに保存させ、
次回実行時にそこから呼び出すしかありません。

終了することなくループするような処理でも、自動で前回の入力値を表示させてくれる事はありません。
「前回の入力値を呼び出す」といった処理をしてやる必要があります。


http://totthi.bbs.fc2.com/?act=reply&tid=15786063
このスレッドの[2016/08/24 (Wed) 08:35:36]書込みのLISPが参考になると思います。
(setenv   )でレジストリに保存し、(getenv   )でレジストリから呼び出しています。

>AutoCADでのLISP使用時も同様なのでしょうか?
AutolispはAutoCAD用にカスタマイズされていますが、LISPの基本仕様はどのアプリでも同じはずです。
また、IJCADのLISPはAutolispに寄せて作られているだろうから、
同じ名前の関数なら同じ仕様だと考えて良いと思います。
  • Lon
  • 2021/06/09 (Wed) 09:33:57
Re: 変数の前回入力値について
リンク参考にさせて頂きました。

<>で囲むと規定値を設定できるの知りませんでした。

setenvとgetenvを自作してDIESELマクロを
そのまま動かすという内容かと思うのですが、
AutoCADLTで作ったカスタムコマンドはあるのですが
勉強も兼ねて基本はLISPで作り替えたいと考えております。
  • BIJIKENTY
  • 2021/06/09 (Wed) 20:08:44
Re: 変数の前回入力値について
例えば下記のようなフランジを作図するコマンドに反映させたいです。

------------------------------------------------

(defun C:Flange()
(setq FGd1 (getdist "\n直径(大):"))
(setq FGd2 (getdist "\n直径(小):"))
(setq FGpcd1 (getdist "\nPCD:"))
(setq FGd3 (getdist "\nボルト穴直径:"))
(setq FGc1 (getint "\nボルト穴数:"))
(setq FGa1 (getdist "\n回転角度(垂直方向0):"))
(setq FGp1 (getpoint "\n作図中心点を指示:"))
(setq FGp2 (list (car FGp1) (+ (cadr FGp1) (/ FGpcd1 2))))

(command "circle" FGp1 (/ FGd1 2))
(command "circle" FGp1 (/ FGd2 2))
(command "circle" FGp2 (/ FGd3 2))
(command "rotate" "l" "" FGp1 FGa1)

(setq count 1)
(while (< count FGc1)
(princ "\n")
(command "rotate" "l" "" FGp1 "c" (/ 360.0 FGc1))
(setq count (+ count 1))
)
(princ)
)

------------------------------------------------


(setq FGd1 (getdist "\n直径(大):"))
の部分を
(setq FGd1 (getdist (strcat "\n直径(大)<" (alltos FGd1) ">:")))
として

(defun ALLtoS (val);
(if (= val nil) "nil" (rtos val))
)

を作ってみたのですが
前回値は問題なく表示させれるようになりましたが
右クリックした際に前回値ではなくnilが入ってしまいます。

リンクのような空白の処理をうまく入れられないでしょうか?
ご教授願います。
  • BIJIKENTY
  • 2021/06/09 (Wed) 20:26:04
Re: 変数の前回入力値について
試してないけど。
(setq pFGd1 FGd1)
(setq FGd1 (getdist (strcat "\n直径(大)<" (alltos FGd1) ">:")))
(if (= nil FGd1) (setq FGd1 pFGd1))
  • 通りすがり
  • 2021/06/10 (Thu) 10:56:20
Re: 変数の前回入力値について
試してないけど、これでもいいはず。
(seqt FGd1 (if (setq temp (getdist (strcat "\n直径(大)<" (alltos FGd1) ">:")))
        temp
        FGd1))
  • 通りすがり2
  • 2021/06/10 (Thu) 12:51:24
Re: 変数の前回入力値について
通りすがりさんからいただいたものは理解できました。

通りすがり2さんからいただいたものも
置き換えてみたらうまく動きましたが
どうゆう動きをしているのか自分には理解できなくて、、、
教えて頂けないでしょうか?
  • BIJIKENTY
  • 2021/06/10 (Thu) 18:29:09
Re: 変数の前回入力値について
getdistの返り値をtempに束縛、
ifがtempが非nilならtempを返す、tempがnilならFGd1を返す。
それをFGd1に束縛、です。

getdistの返り値をFGd1で受けるかtempで受けるかの違いだけです。
  • 通りすがり2
  • 2021/06/10 (Thu) 20:01:34
Re: 変数の前回入力値について
なるほど!
ifの直後はTorFになるようにしなくてはいけないと思い込んでいました。
nilならF、nil以外ならTということだったんですね!
ありがとうございます。

更に入力の部分をgetstringにも対応したいと思いまして

(defun ALLtoS (val);
(if (= val nil)
"nil"
(if (= (type val) (type ""))
(substr val 1)
(rtos val)
)))

とAlltoSの関数を
文字列がきた場合も文字列で返すようにしたのですが
((substr val 1)の部分なぜかただのvalじゃだめでした。なんで?笑)

getstringでの空エンターが""になってしまい、
if文で非nil判定をうけてしまいます。

なにかいい方法はないでしょうか??
  • BIJIKENTY
  • 2021/06/10 (Thu) 20:35:36
Re: 変数の前回入力値について
  • 通りすがり2
  • 2021/06/10 (Thu) 21:25:29
Re: 変数の前回入力値について
(setq FGd4
(if (setq temp (getstring (strcat "\nボルト穴直径 [ピアス(P)/マーク(M)] <" (alltos FGd4) ">:")))
temp
FGd4))

を改善したいのですが
vl-prin1-to-stringをどのように使って
空エンター時にtempで受けるようにできるのでしょうか?
  • BIJIKENTY
  • 2021/06/11 (Fri) 09:15:19
Re: 変数の前回入力値について
話がよくわからないので他の人よろしく。
  • 通りすがり2
  • 2021/06/11 (Fri) 11:26:58
Re: 変数の前回入力値について
説明下手くそでごめんなさい。
解決しました。ありがとうございます。

別の問題がでできました。


(getdist "\n長さ入力[(22.5)/(0)/(90)]")


と規定値をいくつか先に入れておき
カーソルでも選べるようにしたのですが、
なぜか小数点ありの 22.5 を選択した場合
入力値が 22 と切り捨てられます。

原因・対策わかる方おられますでしょうか?
  • BIJIKENTY
  • 2021/06/15 (Tue) 19:17:34
Re: 変数の前回入力値について
分かる方いらっしゃらないですか?
  • BIJIKENTY
  • 2021/06/18 (Fri) 18:04:06

返信フォーム






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