Grossa Speaks Final

コンピュータに関するテーマを
気の向くまま取り上げています。
(時々雑談...)

DenSin 作成ノート その5

2006年07月26日 | Programming
現在のコードは下記の通り。
-----Delphi Code Begin
FormにButton,Editをふたつ。
まだ、プレビュー機能は実装していない。

unit UntiDenSin;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComObj, StdCtrls, ExtDlgs;

type
TForm1 = class(TForm)
Button2: TButton;
OpenDialog1: TOpenDialog;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);

private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;
ICAD: OLEVariant;
ICADHWND: HWND;
BlkOutName: string[255]; //外部ブロック
BlkOnlyName: string[255]; //内部ブロック
BlkX,BlkY: string[255]; //X,Y方向の尺度
BlkAngle: string[255]; //角度
MyIndex: integer;
USERS1: string[255]; // BlkOutName
USERS2: string[255]; // BlkOnlyName
USERS3: string[255]; // BlkX
USERS4: string[255]; // BlkY
USERS5: string[255]; // BlkAngle
IsBlkSelect: boolean; //ブロックが選択されているか

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
ICADHWND:=FindWindow('IntelliCADApplicationWindow',nil);

if IsWindow(ICADHWND) then
begin
//IntelliCADを検出
Icad := GetActiveOleObject('ICAD.Application');

//外部ブロック名の取得
if OpenDialog1.Execute then
begin
IsBlkSelect := true;
BlkOutName := OpenDialog1.FileName;
SetForegroundWindow(ICADHWND);

//外部ブロック
ICAD.ActiveDocument.SetVariable('USERS1',BlkOutName);

//内部ブロック
MyIndex := LastDelimiter('',BlkOutName);
BlkOnlyName := BlkOutName;
Delete(BlkOnlyName,1,MyIndex);

MyIndex := LastDelimiter('.',BlkOnlyName);
Delete(BlkOnlyName,MyIndex,4); //少し乱暴なやりかた

ICAD.ActiveDocument.SetVariable('USERS2',BlkOnlyName);

//X方向の尺度
BlkX := Edit1.Text;
ICAD.ActiveDocument.SetVariable('USERS3',BlkX);


//Y方向の尺度
BlkY := Edit2.Text;
ICAD.ActiveDocument.SetVariable('USERS4',BlkY);

//角度
BlkAngle := '0';
ICAD.ActiveDocument.SetVariable('USERS5',BlkAngle);

//Lispをロードする
//Icad.LoadLisp('C:CADDenSindensin.lsp');

//Lispを実行する
//Icad.RunCommand('densin' + #13);

end
else
ShowMessage('CANCEL');
end
else
ShowMessage('IntelliCAD is nowhere');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if IsBlkSelect then
begin
//Lispをロードする
Icad.LoadLisp('C:CADDenSindensin.lsp');

//Lispを実行する
Icad.RunCommand('densin' + #13);
end
else
ShowMessage('Select block');

end;

end.

-----Delphi Code End


-----Lisp Code Begin

;;File Name "densin.lsp"
;;Command Name "des"
;;
;;Action "DenSin用ブロック挿入"
;;
;;;;How to Use
;;(1)単体では動作しない
;;(2)DenSin.exeから自動ロード、自動実行
;;Code Begin----------
;*****エラー処理(数値以外の入力)
(defun *error* (msg)
(princ msg)
(princ)
)
(defun C:densin()

;;外部ブロック
(setq exblk_name (getvar "USERS1"))

;;内部ブロック
(setq inblk_name (getvar "USERS2"))

;;内部ブロック名の確認
(if (tblsearch "block" inblk_name)
(setq ins_name inblk_name)
(setq ins_name exblk_name)
)

;*****直行モードをOFF
(setvar "ORTHOMODE" 0)

;;ブロックを原点に挿入
(setq ins_p "0,0,0")
(setq ins_x (getvar "USERS3"))
(setq ins_y (getvar "USERS4"))
(setq ins_a (getvar "USERS5"))

(command "insert" ins_name ins_p ins_x ins_y ins_a)

;;挿入したブロックを選択
(setq myblock (entlast))

;;ブロックを移動
(command "move" myblock "" ins_p )
(setq ins_np (getpoint))
(command ins_np)

;*****直行モードをON
(setvar "ORTHOMODE" 1)

;;ブロックを回転
(command "rotate" myblock "" ins_np )


)
;;Code End-------------

----Lisp Code End

最新の画像もっと見る

コメントを投稿