Geeklog Site http://www.icadweb.com Another Nifty Geeklog Site master@icadweb.com master@icadweb.com Copyright 2008 IcadWeb.com GeekLog Mon, 29 Dec 2008 16:00:07 +0900 ja FC2 ブログ http://www.icadweb.com/article.php/20081229154713599 http://www.icadweb.com/article.php/20081229154713599 Mon, 29 Dec 2008 15:47:13 +0900 http://www.icadweb.com/article.php/20081229154713599#comments News <p>今年は、ここを復活させるぞ!と思っておりましたが... 気が付いてみれば?年の瀬を迎えております。(汗)</p><p>これからCADのカスタマイズ!を語ろうとした場合、私のポジション的には、DRX-API を無視できないわけで、ネタは、いろいろと暖めているのですが... 材料が揃わない。</p><p>にも関わらず、多数のご訪問ありがとうございます。来年は、何か面白いものを提供したいと考えております。</p><p>どうぞ、よろしくお願いいたします。</p><p>今、何してるの? こちらでブログを書いております。<br /><a href="http://ebaz.blog8.fc2.com/">http://ebaz.blog8.fc2.com/</a></p> http://www.icadweb.com/trackback.php/20081229154713599 サーバー移転 http://www.icadweb.com/article.php/20081007115314332 http://www.icadweb.com/article.php/20081007115314332 Tue, 07 Oct 2008 11:53:14 +0900 http://www.icadweb.com/article.php/20081007115314332#comments News <p>本ドメイン(icadweb.com)は、管理者(江端)が個人で所有&管理しておりますが... 基本的には、母体となる会社のサーバーを「間借り」させて頂いております。会社のサーバーの見直しがあり、本サイトも引っ越すことになりました。</p><p>引越し完了!です。</p> http://www.icadweb.com/trackback.php/20081007115314332 LISP入門 第37回: 条件式 http://www.icadweb.com/article.php/lisp_37 http://www.icadweb.com/article.php/lisp_37 Tue, 23 Sep 2008 16:04:54 +0900 http://www.icadweb.com/article.php/lisp_37#comments LISP <p>(if) 関数の第1引数... (条件式)について、</p><p><table width="250" border="1"> <tbody> <tr> <td>=</td> <td>等号(等しい)</td> </tr> <tr> <td>/=</td> <td>不等号(等しくない)</td> </tr> <tr> <td>&lt; , &lt;= , &gt; , &gt;=</td> <td>比較 (大きい,小さい)</td> </tr> <tr> <td>and</td> <td>論理積</td> </tr> <tr> <td>or</td> <td>論理和</td> </tr> </tbody></table></p><p>LISP では、真(True) = <b>T</b> , 偽(False) = <b>nil </b></p><p>例:<br /><table width="250" border="0"> <tbody> <tr> <td> <p>(setq&nbsp;a 5.0)<br /> (setq b 10.0)</p> </td> <td>&nbsp;</td> </tr> <tr> <td>(= a 5.0)</td> <td>結果:T</td> </tr> <tr> <td>(= a b)</td> <td>結果:nil</td> </tr> <tr> <td>(/= a b)</td> <td>結果:T</td> </tr> <tr> <td>(&lt; a 5.0)</td> <td>結果:nil</td> </tr> <tr> <td>(&lt;= a 5.0)</td> <td>結果:T</td> </tr> <tr> <td>(&lt; a 8.0)</td> <td>結果:T</td> </tr> <tr> <td>(&lt; a b)</td> <td>結果:T</td> </tr> <tr> <td>(and&nbsp;(&gt; a 2.0) (&lt; a 8.0))</td> <td>結果:T</td> </tr> <tr> <td>(or (= a 0.0)(= b 0.0))</td> <td>結果:nil</td> </tr> </tbody></table></p><p>入れ子にすることでもっと複雑な条件式を作成することができます。</p><p><table width="250" border="1"> <tbody> <tr> <td>(or (and (&lt; a 10.0)(&lt; b 10.0)) (= c 0.0))&nbsp;</td> </tr> </tbody></table></p><p>このような複雑な式は、複数行にして字下げして書くと分かりやすいと思います。</p><p><table width="250" border="1"> <tbody> <tr> <td> <p>(or<br />  (and<br />   (&lt; a 10.0)<br />   (&lt; b 10.0)<br />  )<br />  (= c 0.0)<br /> )&nbsp;</p> </td> </tr> </tbody></table></p> http://www.icadweb.com/trackback.php/lisp_37 LISP入門 第36回: 条件によって分岐する http://www.icadweb.com/article.php/lisp_36 http://www.icadweb.com/article.php/lisp_36 Sun, 21 Sep 2008 09:53:36 +0900 http://www.icadweb.com/article.php/lisp_36#comments LISP <p>決められた処理を順番に処理するだけであれば、スクリプトで十分。スクリプトとプログラムの決定的な違いは、途中で処理を条件によって分岐できるかどうか?ということになるかと思います。</p><p>(if) 関数は、その名の通り 「もし~だったら...」という処理に使用します。</p><p>例:<br /> もし、Aの値が、10より大きかったら...<br /> もし、選択した図形が円だったら...</p><p><table width="250" border="1"> <tbody> <tr> <td> <p>(setq a 15)<br /> (if (&lt; a 10)<br />  (princ &quot;10より小さい!&quot;)<br />  (princ &quot;10以上!&quot;)<br /> )</p> <p>結果:10以上</p> </td> </tr> </tbody></table></p><hr /><p>(cond) 関数は、Basic / Pascal / C言語の switch 文に相当します。(if) が、Yes / No&nbsp;分岐に対して、(cond) は、「Aの値が、1だったら... 2だったら... 3だったら...」という複数の分岐に使えます。</p><p><table width="250" border="1"> <tbody> <tr> <td>(cond<br />  ((= color 1) (princ &quot;赤です!&quot;))<br />  ((= color 2) (princ &quot;黄です!&quot;))<br />  ((= color 3) (princ &quot;緑です!&quot;))<br />  (T&nbsp;(princ &quot;それ以外!&quot;))<br /> )</td> </tr> </tbody></table></p><p>(if) を入れ子にすることで、(cond) と同じような動作をするプログラムを作ることができますが、(cond)を使ったほうが、プログラムがすっきりしますし処理も高速です。</p><p><table width="250" border="1"> <tbody> <tr> <td> <p>(if (= color 1)<br />  (princ &quot;赤です!&quot;)<br />  (if (color = 2)<br />   (princ &quot;黄です!&quot;)<br />   (if (color = 3)<br />    (princ &quot;緑です!&quot;)<br />    (princ &quot;それ以外!&quot;)<br />   )<br />  )<br /> )</p> </td> </tr> </tbody></table></p> http://www.icadweb.com/trackback.php/lisp_36 AutoCAD LTの座標取得(getpoint) http://www.icadweb.com/article.php/20080921093407682 http://www.icadweb.com/article.php/20080921093407682 Sun, 21 Sep 2008 09:34:07 +0900 http://www.icadweb.com/article.php/20080921093407682#comments 豆知識 <p>AutoCAD LTを始めて触った時、AutoLISPが使えない事を知り、「こんな物使えるか!」と思いました。</p><p>(getpoint)が使えない事には、ちょっとした作図コマンドすら出来ないので、使いにくいと定評(?)のあるAutoCADの標準コマンドだけで作図をしなければならない。</p><p>ある時、「ID;&#092;」と「@」,「&#36;M=&#36;(getvar.&quot;LASTPOINT&quot;)」を組み合わせたマクロを教えて頂きました。これは、正直、驚きました... その後、パワーユーザーの皆様の創意工夫によって、さまざまなマクロが作成されるようになったのですが、どう頑張ってもLT(DIESEL)では出来ない事が沢山あって... 先にAutoLISPによるAutoCADの拡張性の高さを知ってしまった私としては、どうしてもDIESELに没頭する気にはなれなかったのでした。</p> http://www.icadweb.com/trackback.php/20080921093407682 LISP入門 第35回: 入力待ち (command pause) http://www.icadweb.com/article.php/lisp_35 http://www.icadweb.com/article.php/lisp_35 Sat, 20 Sep 2008 06:47:28 +0900 http://www.icadweb.com/article.php/lisp_35#comments LISP <p>何か、たとえばLINEコマンドを使って作図を行う、拡張コマンドを作成する場合...</p><p>最初に紹介した方法...<br />(command &quot;_LINE&quot; pause ...)</p><p>2番目に紹介した方法...<br />(setq po (getpoint &quot;&#092;n点を入力:&quot;))<br />(command &quot;_LINE&quot; po ...)</p><p>を紹介しました。</p><p>2番目に紹介した方法(あらかじめ必要な点を取得して変数へ代入>変数を (command) 関数へ渡す)の利点は、利用者の入力値がチェックできる事です。</p><p>堅牢なプログラムにするためには、入力値のチェックは必須といえます。プログラムの誤動作の多くは 、作者が「そのような操作を想定していなかった」 ということに起因します。</p><p>使用方法が分からない利用者は、どのような操作をするか分かりません。誤った操作をした場合、適切なエラーメッセージを表示し、利用者に操作が間違っている事を伝えるほうが親切なプログラムといえます。</p><p>(command pause)を使った場合、puaseに対して利用者が何を入力したのか?という事がチェックできません。入力が間違っていれば、それ以降のプログラムは正常動作しなくなりますので、できるだけ避けたほうが宜しいかと思います。</p> http://www.icadweb.com/trackback.php/lisp_35 LISP入門 第34回: 文字列 http://www.icadweb.com/article.php/lisp_34 http://www.icadweb.com/article.php/lisp_34 Thu, 18 Sep 2008 18:12:09 +0900 http://www.icadweb.com/article.php/lisp_34#comments LISP <p>数値/座標の入力を得る方法を説明しました。文字の入力には、(getstring)を使います。基本的な使い方は、今までに説明した(get~)関数と同じです。</p><p><table width="250" border="1"> <tbody> <tr> <td>(setq name (get<font color="#0000ff">string</font> &quot;名前:&quot;))</td> </tr> </tbody></table></p><p>とすると、変数(name)に入力された値が文字列として代入されます。</p><p>数字を現わす文字を入力した場合も、それは数字ではなく、文字として扱われます。</p><p><table width="250" border="1"> <tbody> <tr> <td>:(setq name (get<font color="#0000ff">string</font> &quot;名前:&quot;))<br /> 名前: 123<br /> &quot;123&quot;<br /> :!name<br /> &quot;123&quot;</td> </tr> </tbody></table></p><p>123という数字がダブルクォーテーション「&quot;」で囲まれている事に注目してください。&rarr;&quot;123&quot;</p><p>これは、123という数値ではなく「123」という文字列です。</p><p>試しに、これ(&quot;123&quot;が代入されたnameという変数)を使って数値計算をするとエラーになります。</p><p><table width="250" border="1"> <tbody> <tr> <td>:(+ name 10)<br /> エラー:引数のタイプが違います.</td> </tr> </tbody></table></p><p><b>数値と文字列は明確に区別する必要があります</b>。プログラムを作成していると、<span style="color: #ff0000">[文字列]&lt;&gt;[数値] の変換</span>がしたいという場面に良く出会います。</p><p>LISPでは、次の関数が用意されています。</p><p><table width="250" border="1"> <tbody> <tr> <th colspan="2">文字&rarr;数値</th> </tr> <tr> <td> (atoi)</td> <td>文字を[整数]に変換</td> </tr> <tr> <td> (atof)</td> <td>文字を[実数]に変換</td> </tr> <tr> <th colspan="2">数値&rarr;文字</th> </tr> <tr> <td> (itoa)</td> <td>[整数]を文字に変換</td> </tr> <tr> <td> (rtos)</td> <td>[実数]を文字に変換</td> </tr> <tr> <td> (angtos)</td> <td>[角度]を文字に変換</td> </tr> </tbody></table></p><p>また、文字列を処理するための関数として、以下のようなものがあります。</p><p><table width="250" border="1"> <tbody> <tr> <th colspan="2">文字列操作関数</th> </tr> <tr> <td> (strcat)</td> <td>複数の文字列を連結する。</td> </tr> <tr> <td> (substr)</td> <td>文字列から一部を切出す。</td> </tr> <tr> <td> (strlen)</td> <td>文字列の長さを調べる</td> </tr> <tr> <td> (strcase)</td> <td>大文字/小文字変換</td> </tr> <tr> <td> (wcmatch)</td> <td>文字の比較(ワイルドカード可)</td> </tr> </tbody></table></p><p>&nbsp;</p> http://www.icadweb.com/trackback.php/lisp_34 LISP入門 第33回: 座標点>X,Y,Z座標を取得 http://www.icadweb.com/article.php/lisp_33 http://www.icadweb.com/article.php/lisp_33 Thu, 18 Sep 2008 08:47:54 +0900 http://www.icadweb.com/article.php/lisp_33#comments LISP <p>(getpoint)で取得した座標点(x,y,z)の X座標を取り出す方法は?&nbsp;</p><p><img height="112" alt="" hspace="10" width="141" align="right" vspace="10" border="0" src="http://www.icadweb.com/images/library//Image/begin/lsp_33.gif" /></p><p>右図のような3角形を描くコマンドを考えます。</p><p>2点(P1,P2)点を取得して、直角三角形を描きます。ここで、P1= (P1x, P1y) 、P2= (P2x, P2y) としたとき、直角部分の頂点&nbsp;P0 は、P2のX座標, P1のY座標とすることにします> P0= (P2x, P1y)<br clear="all" />&nbsp;</p><p>P1, P2 座標は、前回説明したように、(getpoint) (getcorner) で取得します。</p><p>1点目> (setq p1 (getpoint &quot;1点目:&quot;))<br />2点目> (setq p2 (getcorner p1 &quot;2点目:&quot;))</p><p>&nbsp;このようにして得た変数 p1,p2 には、座標が保存されています。</p><p>変数の内容を確認...</p><p><table width="200" border="1"> <tbody> <tr> <td>:!p1<br /> (341.293 64.6535 0.000000)</td> </tr> </tbody></table></p><p>&nbsp;この例では、X=341.293, Y=64.6535, Z=0.000000 となっています。小数点以下の精度については、こちらを参照してください><a href="http://www.icadweb.com/article.php/lisp_03">あれ?答えが違うぞ...</a></p><p>(341.293 64.6535 0.000000) のようなデータを 「リスト」 と呼び、LISPプログラム言語の基本的なデータ構造となります。</p><p>LISPプログラム言語についての詳細は、ここでは詳しく解説しませんが... リストの1番目の値(X座標)、2番目の値(Y座標)を取り出すには次のようにします。</p><p>X座標> (car p1)<br />Y座標> (cadr p1)<br />Z座標> (caddr p1)</p><p>また、n番目の値を取り出すのに、(<a href="http://www.icadweb.com/icad_doc/dev/IDR_LISP_B234.htm">nth</a>) 関数が使えます。</p><p>X座標> (nth 0&nbsp;p1)<br />Y座標> (nth 1&nbsp;p1)<br />Z座標> (nth 2&nbsp;p1)</p><p>点p1のX座標を、変数 p1x へ代入する...</p><p><table width="200" border="1"> <tbody> <tr> <td> <p>:(setq p1x (car p1))<br /> 341.293</p> <p>:!p1x<br /> 341.293</p> </td> </tr> </tbody></table></p><p>今回の課題では、「<span style="color: #0000ff">頂点&nbsp;P0 は、P2のX座標, P1のY座標とすることにします> P0= (P2x, P1y)</span>」 そこで、新たに座標点 p0(リスト変数) を作成する必要があるのですが、リスト変数の作成は、(<a href="http://www.icadweb.com/icad_doc/dev/IDR_LISP_B211.htm">list</a>) 関数を使います。</p><p>&nbsp;(list 1 2 3 4 5) &rarr; (1 2 3 4 5)</p><p>最後に完成したプログラムを紹介します。</p><p><table width="300" border="1"> <tbody> <tr> <td> <p>(defun c:3KAKU()<br />   (setq p1 (getpoint &quot;&#092;n1点目:&quot;))<br />   (setq p2 (getcorner p1 &quot;&#092;n2点目:&quot;))<br />   (setq<br />    p2x (car p2)<br />    p1y (cadr p1)<br />   )<br />   (setq p0 (list p2x p1y))<br />   (command &quot;_line&quot; p1 p0 p2 &quot;c&quot;)<br />   (princ)<br /> )</p> </td> </tr> </tbody></table></p><p>&nbsp;このような図形が必要となる人がいるかどうか? このプログラムそのものは、実用的ではないように思いますが、このサンプルは、いろいろと応用が利くと思います。</p><p>これまでの説明とサンプルプログラムを見ても、LISPで何ができるんだろ?とイメージできなかったように思いますが、これを実際に動かしてみると、少し勘の良い人であれば、「いろいろな事ができるかも?」と、可能性を感じていただけるのではないかと思います。</p> http://www.icadweb.com/trackback.php/lisp_33 LISP入門 第32回: 座標点を取得する(2) http://www.icadweb.com/article.php/lisp_32 http://www.icadweb.com/article.php/lisp_32 Thu, 18 Sep 2008 08:18:00 +0900 http://www.icadweb.com/article.php/lisp_32#comments LISP <p>座標の取得には、(getpoint)の特殊バージョンともいえる、(getcorner)という関数があります。これは丁度、四角形(RECTANGLE)コマンドの2点目(対角コーナー)を指示するような時に使います。</p><p>(getpoint)に座標引数を与えて使った場合、仮想線が「斜線」で表現されるのに対し、(getcorner)は仮想線が「矩形」で表現されます。</p><p><table width="300" border="1"> <tbody> <tr> <td>① (getcorner point [prompt])</td> </tr> </tbody></table></p><p>(getcorner)は、基準点が無い事には矩形が書けないので引数の座標は省略できないようになっています。</p><p>1点目(getpoint)、2点目(getcorner) 対角頂点座標を取得して、四角形(4KAKU)コマンドを作成してみます。<br /><br /><table width="300" border="1"> <tbody> <tr> <td>(defun c:4KAKU()<br />   (setq <font color="#ff0000">p1</font> (getpoint &quot;&#092;n1点目:&quot;))<br />   (setq p2 (<span style="color: #0000ff">getcorner</span> <font color="#ff0000">p1</font> &quot;&#092;n2点目:&quot;))<br />   (command &quot;RECTANGLE&quot; p1 p2)<br />   (princ)<br /> )</td> </tr> </tbody></table></p><p>このコマンド(4KAKU)は、IntelliCADによって標準で提供される四角形(RECTANGLE)コマンドと同じなので、まるで意味はありませんが、ここでは、(getcorner)の使い方を紹介するサンプルとして紹介いたしました。</p><hr /><p>少し脱線...</p><p>上記のプログラムで、変数:p1の座標がいらない場合は、次のように「入れ子」にする事ができます。<br /><br /><table width="300" border="1"> <tbody> <tr> <td nowrap="nowrap">(setq p2 (getcorner <font color="#0000ff">(getpoint &quot;&#092;n始点:&quot;)</font> &quot;&#092;n2点目:&quot;))</td> </tr> </tbody></table><br />これは複数行にして...<br /><table width="300" border="1"> <tbody> <tr> <td nowrap="nowrap">(setq<br />  p2 <font color="#ff0000">(</font>getcorner <font color="#0000ff">(getpoint &quot;&#092;n始点:&quot;)</font> &quot;&#092;n2点目:&quot;<font color="#ff0000">)</font><br /> )</td> </tr> </tbody></table></p><p>とも書けます。「入れ子」が深くなると、括弧の数を間違えやすいので、このように適宜、複数行に書いた方が分かりやすいでしょう。</p><p>また、応用例として...</p><p><table width="300" border="1"> <tbody> <tr> <td nowrap="nowrap">(setq<br />  p2 <font color="#ff0000">(</font>getpoint <font color="#ff0000">(setq p1</font><font color="#0000ff">(getpoint &quot;&#092;n始点:&quot;)</font><font color="#ff0000">)</font> &quot;&#092;n終点&quot;<font color="#ff0000">)</font><br /> )</td> </tr> </tbody></table></p><p>とすることもできます。値を代入するだけのように思われる(setq)関数でも、しっかり値を返しています。</p> http://www.icadweb.com/trackback.php/lisp_32 LISP入門 第31回: 座標点を取得する(1) http://www.icadweb.com/article.php/lisp_31 http://www.icadweb.com/article.php/lisp_31 Wed, 17 Sep 2008 09:35:50 +0900 http://www.icadweb.com/article.php/lisp_31#comments LISP <h4>座標を取得する</h4><p>既に何度か出てきていますが、画面上でマウスを指示した座標が欲しい時には(getpoint)を使います。この関数は、対話的なコマンドを作る場合には必ず使うといっても良いでしょう。</p><p>(getpoint)の文法も、前回(<a href="http://www.icadweb.com/article.php/lisp_30">第30回: 距離の入力</a>)上で説明した(getdist)と同じです。次のような使い方が出来ます。</p><p><table width="250" border="1"> <tbody> <tr> <td>① (getdist prompt)<br /> ② (getdist point prompt)</td> </tr> </tbody></table>※入力メッセージ(prompt)を省略するタイプは割愛..</p><p>①は1点目の入力、②は2点目の入力に使われます。②のタイプは、引数に指定した座標(point)から、斜線の仮想線が表示される所が特徴です。</p><p>本講座で、初めて作成したコマンド>単線コマンド</p><p>参照>「<a href="http://www.icadweb.com/article.php/lisp_15">第15回: 単線コマンドを作る</a>」</p><p><table width="250" border="1"> <tbody> <tr> <td>(defun c:LINE1()<br />   (command &quot;LINE&quot; pause pause &quot;&quot;)<br />   (princ)<br /> )<br /> (princ)</td> </tr> </tbody></table></p><p>&nbsp;これを、座標取得関数 (getpoint)を使って書き直してみます。</p><p>これを(getpoint)で書き換えると次のようになります。<br /><br /><table width="250" border="1"> <tbody> <tr> <td>(defun c:LINE1()<br />   (setq <font color="#ff0000">p1</font> (getpoint &quot;&#092;n始点:&quot;))<br />   (setq p2 (getpoint <font color="#ff0000">p1</font> &quot;&#092;n終点:&quot;))<br />   (command &quot;LINE&quot; p1 p2 &quot;&quot;)<br />   (princ)<br /> )<br /> (princ)</td> </tr> </tbody></table></p><p>始点(p1)と終点(p2)の取得に使っている(getpoint)の引数の違いに注目して下さい。始点として取得した座標(p1)を、直ちに終点を取得するための(getpoint)に使用している所がポイントで、このような使い方をすると、p2点を入力する際、<span style="color: #0000ff">p1点からラバーバンドが表示されます</span>。</p><p>実際にIntelliCADで試してみると良く分かります。&nbsp;</p> http://www.icadweb.com/trackback.php/lisp_31