この投稿では、「非プログラマ」がBricsCADをカスタマイズするために利用できる最も強力な方法、つまりLISPプログラミング言語について見ていきます。この投稿では、独自のLISPルーチンを作成するために必要な最初のステップを学びます。
BricsCADのLISPコマンドの完全な概要については、公式、 BricsCAD LISP開発者ガイド.
この投稿では、次のトピックについて説明します。
なぜプログラムを書くのですか?
多くのCADユーザーと同じように、図面の作成に忙しく、ソフトウェアプログラムの作成方法を学ぶ時間はありません。 「プログラミング言語を学ぶ必要がないのはなぜですか」と疑問に思われるかもしれません。ある意味、学校に戻ってきたようなものです。教室に座っていると、時間の無駄のように見えることがあります。
しかし、あなたが今学んだことは後で人生を楽にします。いくつかのLISPプログラミングを学ぶことは、LISPに面倒なタスクを実行させるために、数行のコードをむち打ちする気分が本当によくなることを意味します。 LISPの良いところは、オンザフライでプログラムできることです。そして、あなたは本当にシンプルですが面倒なタスクにそれを使うことができます。
このチュートリアルで使用する例を次に示します。
Idコマンド
BricsCADには Id コマンド。画面上の点を選択すると、 Id ポイントの3D x、y、z座標を報告します。問題は、 Id 次のように、コマンドプロンプト領域に値を報告します。
: id
座標を特定する点を選択してください: (ポイントを選択してください。)
X = 8.9227 Y = 6.5907 Z = 0.0000
あなたが変えることができたらそれは素晴らしいことではないでしょうか Id 座標を図面のピックポイントの隣に配置しますか?これにより、外構計画のX、Y座標、Z標高にラベルを付けることができます。 LISPを使用すると、それが可能になります。
攻撃計画
LISPコードを記述する前に、これらのX、Y、Z座標をコマンドプロンプト領域から図面に取得する方法を理解する必要があります。問題の解決には2つの部分があることを認識してください。
パート1。 おそらく点を選択することにより、図面から座標を取得します。
パート2。 座標をテキストとして図面に配置します。
座標の取得
LISPは、選択した点の座標を取得するいくつかの方法を提供します。をブラウジング LISPプログラミング言語リファレンス、あなたはあなたができることを学びます:
- 使用 Id コマンドを コマンド 関数、 (コマンド「ID」).
- 使用 LastPoint システム変数 getvar 関数、 (getvar“ lastpoint”).
- 使用 ゲットポイント 関数、 (getpoint「ポイントを選択:」)
3つそれぞれを使用してから何が起こるかを確認することは、有益なレッスンになります。実験することで、間違いを犯し、その間違いから学びます。
- BricsCADを起動し、図面をロードして、F2で[プロンプト履歴]ウィンドウに切り替えます。 「:」プロンプトで、次のように入力します。
: (コマンド “ID“)
ここでは、LISPルーチン内からBricsCADコマンド(Id)を実行しています。コマンド機能により、
LISPでBricsCADコマンドを使用します。 BricsCADコマンドは文字列(「テキスト」のプログラマートーク)であるため、「ID」は引用符で囲みます。前と同じように、BricsCADは要点を尋ねます。 - LISPルーチンのプロンプトに応じて、ポイントを選択します。
座標を識別するポイントを選択します(ポイントを選択します)。
X = 8.9227 Y = 6.5907 Z = 0.0000 - あなたには知られていない、BricsCADは常に、最後に選択した点のx、y、z座標を、 LastPoint。だから、あなたはから座標をコピーする必要があります LastPoint あなた自身の作りの変数に。 LastPointの座標は、選択された点を使用するコマンドの次の使用で上書きされるため、これを行う必要があります。
この章では、 setq 関数は変数に値を格納します。今すぐご活用ください。 「:」プロンプトで、次のように入力します。: (setq xyz (getvar “LastPoint“))
(8.9227 6.5907 0.0000)- Xyz x、y、z座標を格納する変数の名前です。
- Getvar システム変数に格納されている値を取得するLISP関数の名前です。
- そして「LastPoint”はシステム変数の名前です。システム変数名(文字列)なので、引用符で囲みます。
LISP関数を入力すると、BricsCADは変数xyzに格納されている値(8.9227 6.5907など)を返します。
0.0000)—結果は異なります。座標が括弧で囲まれていることに注意してください。これは
LISPが有名なリストと呼ばれます(実際、LISPは「リスト処理」の略です)。スペースは、それぞれx、y、およびz座標である数値を区切ります。x 8.9227
y 6.5907
z 0.0000BricsCADは常に値をx、y、zの順に格納します。最初にZ座標を見つけたり、X座標を最後に見つけたりすることはありません。
したがって、1つ目の方法で最初の問題を解決しました。図面から座標を取得して、変数に格納しました。使用できる3番目のLISP関数については触れましたが、 ゲットポイント。プログラマーは好む ゲットポイント それはよりも効率的であるため Id-LastPoint 上記で使用したコンボ。
次のように入力して、同じように機能することを確認します。違いは、プロンプトテキスト(「ポイント:」)を提供することです。
: (setq xyz(ゲットポイント 「ポイント:」))
ポイント: (ポイントを選択してください。)
(8.9227 6.5907 0.0000)
以前と同様に、 setq 座標の値を変数に格納する関数 xyz。の ゲットポイント 関数は、画面上の点をピックするのを待ちます。の 「ポイント:」 プロンプトと呼ばれ、プログラムがユーザーに期待することをユーザーに伝えます。次のように、何でも簡単に書くことができます。
: (setq xyz(getpoint“マウスボタンを押す:“))
マウスボタンを押します。 (ポイントを選択してください。)
(8.9227 6.5907 0.0000)
または、次のようにプロンプトをまったく表示しないこともできます。
: (setq xyz(getpoint))
(ポイントを選択してください。)
(8.9227 6.5907 0.0000)
そのとおり。プロンプトはありません。正しいことが起こるのを辛抱強く待っているだけの静かなBricsCAD…そしてユーザーは何も起こらない理由に戸惑いました。コミュニケーションの欠如、あなたは言うかもしれません。そのため、プロンプトが重要です。
同じ問題を異なる方法で解決するいくつかのアプローチを見てきました。 x、y、z座標を変数に安全に格納したら、2番目の問題に取り組みましょう。
テキストの配置
図面にテキストを配置するには、 コマンド とともに機能する テキスト コマンド。たぶん マルチテキスト コマンドは機能するかもしれませんが、1行のテキストの場合、 テキスト コマンドは素晴らしいです。の テキスト ただし、コマンドは Id コマンド。 LISPルーチンが応答する必要がある最低4つのプロンプトがあります。
: テキスト
テキスト:スタイル/整列/フィット/中央/中央/右/両端揃え/ :
テキストの高さ<2>:
テキストの回転角度<0>:
テキスト:
出発地点: 数値のペア、具体的にはx、y座標。
テキストの高さ: テキストを読みやすくするための番号。
テキストの回転角度: 数値、おそらく0度。
テキスト: 文字列、この場合はx、y、z座標。
x、y、z座標をテキストとして配置するためのLISP関数を作成してみましょう。
(コマンド“テキスト” xyz 200 0 xyz)
(コマンド それは コマンド 関数。
"テキスト" BricsCADです テキスト 実行中のコマンド。
xyz 変数は、テキストの開始点を格納します。
200 テキストの高さです。この番号を図面に適したものに変更します。
0 テキストの回転角度です。
xyz あなたが幸運であることを意味します: テキスト コマンドはテキストとして数値を受け入れます。
) 覚えておいてください:開き括弧ごとに閉じ括弧が1つあります。
「:」プロンプトでこれを試してください:
: (コマンド「テキスト」xyz 200 0 xyz)
テキスト: スタイル/整列/フィット/中央/中央/右/両端揃え/:
テキストの高さ: 200
テキストの回転角度: 0
テキスト: 2958.348773815669,5740.821183398367
:
BricsCADは テキスト コマンド、プロンプトの応答を挿入し、座標をテキストとして配置します。問題の2番目の部分を解決しました。
それを一緒に入れて
問題の2つの解決策をまとめましょう。
(setq xyz(getpoint“ピックポイント:“))
(コマンド「テキスト」xyz 200 0 xyz)
本格的なLISPプログラムがあります。まあ、そうではありません。ポイントにラベルを付けるたびに、これらの2行を再入力するのは面倒です。次のセクションでは、コードを .lsp ディスク上のファイル。また、コードをドレスアップします。
簡単なLISPプログラムへの追加
あなたが今持っているのは アルゴリズム —実際の作業を実行するすべてのコンピュータプログラムの中核。不足しているのは ユーザーインターフェース —ユーザーがプログラムを使いやすくする部分。
ユーザーインターフェースに必要なのは、「座標を特定するための点を選択してください:」というプロンプトを出す最初の行の一部です。この小さなプログラムには多くのユーザーインターフェイスの問題があります。いくつ考えられますか?ここに私が思いついた問題のリストがあります:
- ポイントにラベルを付けるたびにこれらの2行を再入力するのは面倒です—プログラムに名前を付ける必要があります…
- …そして、新しいBricsCADセッションごとにコードを再入力する必要がないように、ディスクに保存する必要があります…
- …そして、このLISPプログラムを頻繁に使用する場合は、自動的にロードする方法が必要です。
- x、y、z座標は小数点以下8桁まで出力されます。ほとんどのユーザーにとって、それは多すぎます。
- テキストが配置されるレイヤーを制御することができます。
- 特定のテキストスタイルが必要な場合があります。
- 確かに、テキストのサイズと方向をある程度制御したいと考えています。
- これは正反対の考え方です。データを再利用したい場合に備えて、x、y、z座標をディスク上のファイルに保存します。
機能満載の征服
「わかりました」とあなたは思っているかもしれません。「これらはほとんど望ましい改善であることに同意することができます。 Grabowski氏:追加する方法を教えてください。」
しかし、ちょっと待って! LISPに精通していない場合、ユーザーインターフェイスが膨大な量のコードを追加する方法に気付かない可能性があります。これは、より多くのバグとデバッグを意味します。 (プログラミングに精通している場合は、単純なプログラムが機能満杯になるまでの時間をご存じでしょう。)これらの追加された機能はすべて望ましいように聞こえるかもしれませんが、プログラムが望ましくない場合があります。小数点にラベルを付けるたびに、小数点以下の桁数、テキストのフォント、テキストのサイズ、テキストの向き、レイヤー名、ファイル名についての質問に答える必要があるとしたら、いらいらすることを想像できますか?
上記のウィッシュリストをもう一度見てください。あなたにとって重要な機能をチェックして、あなたがなしで生きることができるそれらを取り消します。
ほしいものリスト#1:プログラムの命名
プログラムに名前を付けるには、コードを Defun 次のように、関数に名前を付けます。
(Defun c:ラベル(/ xyz)
(setq xyz(getpoint“ピックポイント:“))
(コマンド「テキスト」xyz 200 0 xyz)
)
追加された内容を少しずつ見てみましょう。
関数の定義– defun
(defun 関数の名前を定義します。 LISPでは、関数、プログラム、ルーチンという用語は同じ意味で使用されます(Defun 「define function」の略です。)
関数の命名– C:
c:label 関数の名前です。このプログラムを「ラベル」と呼ぶことにしました。名前が組み込みのLISP関数や他のユーザー定義関数の名前と競合しない限り、好きな名前を付けることができます。の c: プレフィックスは、このLISPルーチンをBricsCADコマンドのように見せます。
Labelプログラムを実行するには、次のように、「:」プロンプトで「label」と入力するだけです。
: ラベル
座標を特定する点を選択してください: (ポイントを選択してください。)
とき c: 接頭辞がない場合は、次のように、括弧を付けてLISP関数のようにプログラムを実行する必要があります。
: (ラベル)
座標を特定する点を選択してください: (ポイントを選択してください。)
ローカル変数とグローバル変数– /
(/ xyz) の名前を宣言します 入力 、 地元 変数;スラッシュは2つを区切ります。
入力変数 —データをLISPルーチンにフィードします。入力変数の名前はスラッシュの前に表示されます。
ローカル変数 —プログラム内でのみ使用されます。ローカル変数の名前はスラッシュの後に表示されます
このプログラムでは、 xyz プログラム内で厳密に使用される変数の名前です。変数がローカルで宣言されていない場合、変数は グローバル。グローバル変数の値には、 どれか BricsCADにロードされたLISP関数。
変数をローカルとして宣言する利点は、LISPプログラムが終了すると、BricsCADが変数によって使用されていたメモリを自動的に解放することです。欠点は、値が失われ、デバッグが困難になることです。このため、プログラムがデバッグされるまで、ローカル変数はグローバルに保持されます。
そしてその ) 閉じ括弧は、プログラムの開始時に開き括弧のバランスをとります。
ウィッシュリストアイテム#2:プログラムの保存
プログラムをディスク上のファイルに保存することにより、新しいBricsCADセッションごとにコードを再入力する必要がなくなります。これは次のように行います。
- テキストエディターを起動します(Windowsに付属のメモ帳、またはLinuxとMacのテキストエディットで十分です)。表示されているコードを入力してください:
(defun c:label (/ xyz)
(setq xyz (getpoint“ピックポイント: “))
(コマンド「テキスト」xyz 200 0 xyz))
中央からコードをインデントして、目立つようにしました Defun 行と閉じ括弧。これはプログラマーの標準です。インデントにより、コードが読みやすくなります。 LISPは関係ないため、スペースのペアまたはタブキーを使用できます。
- label.lspという名前のファイルをBricsCADのフォルダーに保存します。
ほしいものリスト#3:プログラムの自動読み込み
プログラムをBricsCADにロードするには、次のように入力します。
: (負荷 "ラベル")
BricsCADがLISPプログラムを見つけられない場合は、パスを指定する必要があります。あなたが保存したと仮定 label.lsp の中に \ cad \ support フォルダ:次のように入力します: (「\\ cad \\ support \\ label」をロード)
次のように、ポイントラベル付けルーチンを使用してみます。
: ラベル
座標を特定する点を選択してください: (ポイントを選択してください。)
ヒント BricsCADは、LISPプログラムを自動的にロードする方法を提供します。 BricsCADが起動すると、on_doc_load.lsp.lspというファイルを探します。 BricsCADは、ファイルにリストされているLISPプログラムの名前を自動的にロードします。 on_doc_load.lspにlabel.lspを追加するのは簡単です。 on_doc_load.lspファイルをテキストエディタで開きます(ファイルが存在しない場合は、on_doc_load.lspという新しいファイルを開始して、\ BricsCADフォルダに保存します)。プログラムの名前を追加します。(load“ label.lsp”)on_doc_load.lspファイルを保存します。 BricsCADを起動すると、ラベルが自動的に読み込まれます。——– |
追加 label.lsp に on_doc_load.lsp は簡単だ。を開く on_doc_load.lsp テキストエディタでファイルを作成します(ファイルが存在しない場合は、新しいファイルを acad.lsp そしてそれを \ BricsCAD フォルダ)。プログラムの名前を追加します。
(「label.lsp」をロード)
を助けて on_doc_load.lsp ファイル。 BricsCADを起動するとロードされます ラベル 自動的に。
ウィッシュリスト#4:車とCDRの使用
x、y、z座標は小数点以下8桁に出力されます—これは多すぎます。 2つの解決策があります。
1つは、次のコードで示すように、小数点以下の桁数をユーザーに確認することです。
: (setq uprec(getint “ラベル精度:“))
ラベル精度:1
1
または、システム変数に保存されている値を盗みます LUPrec —ユーザーが指定した精度 単位 コマンド—ユーザーは一貫した単位を望んでいるという(必ずしも真ではない)仮定の下で。これを行うコードは次のとおりです。
(setq uprec(getvar 「LUPREC」))
それは簡単な部分でした。難しいのは、精度をx、y、z座標に適用することです。これには、3つのステップが必要です。(1)座標トリプレットを選択します。 (2)精度係数を適用します。 (3)座標を結合します。方法は次のとおりです。
- メモ帳またはその他のテキストエディターでlabel.lspを開きます。コードから/ xyzを削除します。これにより変数が「グローバル」になり、BricsCADの「:」プロンプトでその値を確認できます。コードは次のようになります。
(defun c:label()
(setq xyz(getpoint“ピックポイント:“))
(コマンド「テキスト」xyz 200 0 xyz))
- 保存し、label.lspをBricsCADにロードします。
- 画面上の任意の点をピックして、label.lspを実行します。画面に座標が表示されない場合は、範囲を拡大してください。
- 「:」プロンプトで、次のように入力します。
: !xyz
(6.10049 8.14595 10.0)感嘆符は、BricsCADがx、y、z座標を保持する変数xyzの値を出力するように強制します。選択した場所によって、結果は異なります。
- LISPには、リストを選択するための関数がいくつかあります。ここでは、car関数とcdr関数、およびそれらの組み合わせを使用します。の 車 関数は、リストから最初の項目(x座標)を抽出します。やってみよう:
: (車 xyz)
6.10049 - の CDR 関数は 車。リストから最初のアイテムを削除し、残ったものを表示します。
: (CDR xyz)
(8.14595 10.0) - に加えて 車 、 CDR、LISPでは、「a」と「d」をいくつかの方法で組み合わせて、リスト内の他の項目を抽出できます。 y座標を抽出するには、次を使用します。 Cadr、 次のように:
: (Cadr xyz)
8.14595 - そしてz座標を抽出するには、 caddr、 次のように:
: (caddr xyz)
8.14595 - これで、変数xyzからx座標、y座標、およびz座標を抽出する方法ができました。次のように、それらを独自の変数に格納します。
: (setq ptx (車 xyz)
欠落:1)> pty (Cadr xyz)
欠落:1)> ptz (caddr xyz)
欠落:1)>)変数を使用します PtX x座標を保存するには、 PtY y座標など。また、上のコードでは、LISPの省略形を使用して、setq関数を複数の変数に適用できます。 BricsCADの「Missing:1)>」プロンプトの理由を思い出してください。閉じ括弧が欠落していることを思い出させます。
- 3つの座標が分離されたので、最終的に小数点以下の桁数を減らすことができます。これを行うにはいくつかの方法があります。使用 rtos これは、2つの処理を同時に実行するためです。(1)小数点以下の桁数を0から8までの任意の数に変更します。 (2)実数を文字列に変換します。
なぜひもですか?後でわかります。今のところ、 rtos 仕事での機能:: (rtos ptx 2 uprec)
“6.1”の rtos 関数は、ptx、2、uprecの3つのパラメーターを使用します。
PtX 実数を保持する変数の名前。
2 変換のタイプ、この場合は10進数。数値2は、5つの単位モードを定義するシステム変数LUnitsに基づいています。- 科学的
- 10進数
- エンジニアリング
- 建築の
- フラクショナル
UPrec 精度を保持する変数の名前(そのコードはこのセクションの最初にあります)。これは、ユニットのタイプによって異なります。たとえば、10進数の値2は小数点以下2桁を意味します。 2は建築上の意味で1/4インチを意味します。
次に、精度が UPrec 1、 rtos 上記のコードフラグメントの関数は、6.10049を6.1に減らします。 - 次のように、x、y、およびzの値を3回切り捨てて保持します。
: (setq ptx (rtos ptx 2 uprec)
1> pty(rtos pty 2 uprec)
1> ptz(rtos ptz 2 uprec)
1>)変数をそれ自体に等しく設定できることに注意してください。 PtX rtosが格納された以前の値の処理を完了した後のx座標の新しい値を保持します PtX。このような変数名を再利用すると、メモリを節約できます。
- 座標が切り捨てられたので、これらを一緒に文字列化する(しゃれを許す)必要があります。 strcat 関数、文字列連結の略。やってみよう:
: (strcat ptx pty ptz)
“6.18.110.0”それはもっとそれに似ています!
- テキストエディタに戻ります。ここで開発したコードを太字で示し、LISP関数を紫色で追加します。
(Defun c:label(/ xyz xyz1 uprec ptx pty ptz)
(setq uprec(getint “ラベル精度:“))
(setq xyz(ゲットポイント “ピックポイント:“))
(setq ptx(車 xyz)
pty(Cadr xyz)
ptz(caddr xyz)
)
(setq ptx(rtos ptx 2 uprec)
pty(rtos pty 2 uprec)
ptz(rtos ptz 2 uprec)
)
(setq xyz1(strcat ptx“、” pty“、” ptz))
(コマンド 「テキスト」xyz 200 0 xyz1)(
- すべての変数がローカルであることに注意してください。また、最後の数行の変数xyzへの変更にも注意してください。丸められた座標にテキストを配置したくないので、テキスト文字列を保持する変数としてxyz1を使用します。
- 最後に、コードにコメントを追加して、数か月後のコードを見たときにコードが何をするかを思い出させる必要があります。セミコロンはコメントの始まりを示します。
; Label.Lspは、選択した点にそのx、y、z座標でラベルを付けます。
; Ralph Grabowski、1996年2月25日。
(defun c:label(/ xyz xyz1 uprec ptx pty ptz);小数点以下の桁数をユーザーに尋ねます。
(setq uprec(getint“ラベル精度:“))
;図面内の点を選択するようにユーザーに依頼します。
(setq xyz(getpoint“ピックポイント:“))
; 3Dポイントを個別のX、Y、Z値に分離します。
(setq ptx(車xyz)
pty(cadr xyz)
ptz(caddr xyz)
)
;値を切り捨て:
(setq ptx(rtos ptx 2 uprec)
pty(rtos pty 2 uprec)
ptz(rtos ptz 2 uprec)
)
;個々の値を3Dポイントに再結合します。
(setq xyz1(strcat ptx“、” pty“、” ptz))
;テキストを配置:
(コマンド「テキスト」xyz 200 0 xyz1))
- ファイルをlabel.lspとして保存し、LISPルーチンをBricsCADにロードします。
: (負荷 “ラベル“)
「C:LABEL」 - ルーチンを実行し、プロンプトに応答します:」
:ラベル
ラベル精度:1
点を選択:(点を選択します。)
テキストを揃える…/ :
テキストの高さ<200.0000>:200
テキストの回転角度<0>:0
テキスト:5012.3、773.2、0.0
:
データをファイルに保存する
前のチュートリアルでは、ユーザーインターフェイスの拡張について心配し始めました。 2行のコードとして始まったものが23に膨らみました。このチュートリアルでは、機能の膨張と戦う方法(後で説明)を学び、データをファイルに保存する機能を追加します。
読者がこのウィッシュリストアイテムを書いてくれました。「LISPファイルは、使用するプログラムの一部で非常に便利ですが、x、y、z座標で収集したデータをテキストに保存したいのですが。ファイル。"
ファイルへのデータの保存は、 開いた, 書き込みライン、そして 閉じる 関数。これを行う方法を見てみましょう。 LISPのファイルアクセス機能は非常に弱いため、LISPでのファイルの処理は、ほとんどのプログラミング言語よりも簡単です。それができることは、ASCIIファイルを順番に読み書きすることだけです。 LISPはバイナリファイルを処理することも、ランダムな順序でデータにアクセスすることもできません。
3つのステップ
データをファイルに書き込むには、3つのステップがあります。
ステップ1。 開いた ファイル。
ステップ2。 書く ファイルへのデータ。
手順3.ファイルを閉じます。
ステップ1:ファイルを開く
LISPには 開いた ファイルを開くための関数。この関数を使用すると、ファイルを開くことができます 1 (1)ファイルからデータを読み取る。 (2)データをファイルに書き込む。または(3)ファイルにデータを追加します。一度にこれらの1つを選択する必要があります。 LISPは一度に3つすべてを行うことはできません。
すべての場合において、ファイルがまだ存在しない場合は、LISPがファイルを作成します。データの読み取りは理解するのに十分簡単ですが、データの「書き込み」と「追加」の違いは何ですか?
- BricsCADにファイルを開くように依頼すると 書く、そのファイル内のすべての既存データは 消した、次に新しいデータが追加されます。
- BricsCADにファイルを開くように依頼すると 追加する、新しいデータは 追加しました 既存のデータの終わりまで。
この目的のために、データをファイルに追加し続けたいので、 追加する モード。 LISPコードは次のようになります。
(setq FIL(開いた 「xyzdata.txt」」a“))
ここで何かを設定しています( setq)という変数に等しい FIL。それは何ですか?ほとんどすべてのプログラミング言語では、ファイル名を直接処理するのではなく、 ファイル記述子。これは、オペレーティングシステムがファイル名を割り当てる名前(文字と数字のシーケンス)です。これで、ファイル記述子が変数に格納されました FIL、あなたは FIL、ファイル名ではなく、これを呼び出すことにしました xyzdata.txt.
最終 「a」 開くことをLISPに指示します xyzdata.txt データを追加します。のオプション 開いた 関数は次のとおりです。
「a」 ファイルの終わりにデータを追加します。
「w」 データをファイルに書き込みます(既存のデータを消去します)。
「r」 ファイルからデータを読み取ります。
ステップ2:ファイルにデータを書き込む
データをファイルに書き込むには、 書き込みライン 関数。この関数は、一度に1行のデータを書き込みます。
(別の機能、 書く 関数、単一書き込み キャラクター ファイルへ)。コードは次のようになります。
(書き込みライン xyz1 fil)
ただし、次のように、3つの小数点と多くの桁のように見えるため、ファイルに生データを書き込むことはできません。
8.15483.27520.0000
ほとんどのソフトウェアは、次のように、数値をコンマで区切ってデータを読み取ることができます。
8.1548, 3.2752, 0.0000
これには、スプレッドシート、データベースプログラム、さらにはいくつかのワープロソフトウェアさえ含まれます。私はこれらのプログラムに、データを読み取るとき、コンマを セパレーター カンマではありません。このようにして、表計算プログラムは各数値を独自のセルに配置します。それぞれの番号がそれぞれのセルにあるので、データを操作できます。このため、データをフォーマットするコードが必要です。
幸いにも、あなたはすでにそれをしました。最後のチュートリアルでは、 strcat とともに機能します CDR, Cadr、そして caddr 座標トリプレットのx、y、zコンポーネントを分離する関数。したがって、次のようなコードを再利用できます。
(setq ptx(車xyz)
pty(cadr xyz)
ptz(caddr xyz)
)
(setq xyz1(strcat ptx“、” pty“、” ptz))
の strcat 関数は、座標値の間にコンマを配置します。
ステップ3:ファイルを閉じる
最後に、整理整頓のために、ファイルを閉じます。 BricsCADは忘れた場合に自動的にファイルを閉じますが、優れたプログラマは自分で片付けます。ファイルを閉じるのは次のように簡単です:
(閉じる フィル)
それを一緒に入れて
開く、フォーマット、書き込み、閉じるためのコードを lable.lsp プログラム:
(defun c:label(/ xyz xyz1 uprec ptx pty ptz)
(setq uprec(getint“ラベル精度:“))
(setq xyz(getpoint“ピックポイント:“))
(setq ptx(車xyz)pty(cadr xyz)
ptz(caddr xyz))
; x、y、z座標をフォーマットします。
(setq ptx(rtos ptx 2 uprec)
pty(rtos pty 2 uprec)
ptz(rtos ptz 2 uprec))
; 3つの座標の間にカンマを追加します。
(setq xyz1(strcat ptx“、“ pty“、“ ptz))
;座標を図面に書き込みます。
(コマンド「テキスト」xyz 200 0 xyz1)
;追加するデータファイルを開きます。
(setq fil(「xyzdata.txt」「a」を開く))
;データ行をファイルに書き込みます。
(write-line xyz1 fil)
;ファイルを閉じます。
(ファイルを閉じる)
)
メモ帳などのテキストエディタを使用して、コピーに追加します。 lable.lsp。それをBricsCADにロードします 負荷 関数:
: (「ラベル」をロード)
次のように入力してプログラムを実行します ラベル 「:」プロンプトで:
: ラベル
ラベルの精度: 4
ピックポイント: (ポイントを選択してください。)
画面上でポイントを選択すると、ルーチンは選択したポイントにラベルを付けますが、3Dポイントデータをファイルに書き込みます。しばらくすると、データファイルは次のようになります。
8.1548, 3.2752, 0.0000
7.0856, 4.4883, 0.0000
6.4295, 5.6528, 0.0000
5.5303, 6.7688, 0.0000
5.4331, 8.3215, 0.0000
ウィッシュリスト#5:レイヤー
ウィッシュリストをもう一度見てみましょう。ウィッシュリスト項目の1つは、テキストが配置されるレイヤーを制御することです。このウィッシュリストアイテムにアプローチする方法は2つあります。
- コードなしの方法は、LISP関数を開始する前にレイヤーを設定することです。
- LISPコードバージョンは、ユーザーに画層の名前を要求し、次にsetvar関数を使用してシステム変数CLayerを設定します(Layerコマンドを使用するよりもはるかに簡単です)。
(setq lname(getstring“ Label layer:“))
(setvar 「CLAYER」lname)「ピックポイント」プロンプトのある行の前に、これらの2行を追加します。
ウィッシュリスト#6:テキストスタイル
文字スタイルを指定するには、同じ2つの方法があります。コードなしの方法は、ルーチンを開始する前にテキストスタイルを設定するだけです。それ以外の場合は、スタイルを設定するのと同様のLISPコードを記述して、 setvar 次のようなコマンド:
(setq tsname(getstring“ Label text style:“)))
(setvar 「TEXTSTYLE」tsname)
もう一度、「ピックポイント」プロンプトが表示されている行の前に、これらの2行を追加します。
今、あなたはあなたのプログラムが大きく見え始めていることに気づいているかもしれません。これは「機能膨張」と呼ばれます。より多くの機能、特にユーザーインターフェイスの領域では、ソフトウェアが基本的なアルゴリズムのサイズをはるかに超えて成長しています。
次は何ですか?
LISPセクションの章を締めくくるために、LISP関数を作成するときに役立つ7つのヒントを紹介します。
今すぐBricsCADを使ってみましょう
多言語、広範囲で使える永久ライセンスとサブスクリプションです。
- 前書き
- BricsCADユーザーのための55のヒント
- 設定
- 環境を変える
- カスタムユーザーインターフェース
- [カスタマイズ]ダイアログボックスの概要
- メニューバーとコンテキストメニューをカスタマイズする
- ツールバーとボタンアイコン
- マクロとディーゼルコードの記述
- リボンのタブとパネル
- キーストロークのショートカット、エイリアス、シェルコマンド
- マウス、ダブルクリック、タブレットボタン
- クワッドについて知っておくべきすべてのこと
- ロールオーバープロパティ
- ワークスペースとユーザーインターフェイス
- 設計ツールと構造パネル
- シンプルで複雑な線種の作成
- ハッチングのパターン化
- 形状とフォントのデコード
- フィールドテキストでのコーディング
- スクリプトを書く
- LISPによるプログラミング(はじめに)
- LISP関数
- 簡単なLISPプログラムを書く