Delphi で Bricscad を使う 2015/ 9/16
ほぼ、自分のためのメモです。バリアント配列の取り扱い、選択セット、フィルターの作成...等、何かの参考にして下さい。
※タイプライブラリの取り込みは、「Delphi で Bricscad 画面キャプチャ」のページを参考にして下さい。
2019/01/03 SelectionSet の取得を修正しました。
unit FNaviZoomUnit3;
interface
uses
//BricscadApp_TLB, BricscadDb_TLB, ComObj を追加
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, BricscadApp_TLB, BricscadDb_TLB,
Vcl.StdCtrls, ComObj, Vcl.CheckLst;
type
TForm3 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
//画層名を取得
procedure TForm3.Button1Click(Sender: TObject);
var
app : IAcadApplication;
doc : IAcadDocument;
lays : IAcadLayers;
i : integer;
s : string;
begin
try
if not Supports(GetActiveOleObject('BricscadApp.AcadApplication'), AcadApplication, app) then begin
ShowMessage('サポートされていません.');
exit;
end;
except
ShowMessage('有効な BricsCAD が見つかりません.');
exit;
end;
lays := app.ActiveDocument.Layers;
ListBox1.Items.Clear;
for i := 0 to lays.Count - 1 do begin
s := Copy(lays.Item(i).Name, 1, 5);
if s = 'ZOOM_' then
ListBox2.Items.Add(lays.Item(i).Name);
end;
end;
procedure LayerZoom(doc: IAcadDocument;const layerName: string);
var
//selSets : IAcadSelectionSets;
selSet : IAcadSelectionSet;
filterType, filterData: OleVariant;
ent : IAcadEntity;
minPoint, maxPoint : OleVariant;
i ,j : integer;
vpt1, vpt2: OleVariant;
begin
// 3D座標を用意
vpt1 := VarArrayCreate([0, 2], varDouble);
vpt2 := VarArrayCreate([0, 2], varDouble);
// セレクションセットを取得
selSet := doc.ActiveSelectionSet;
// フィルターを作成
filterType := VarArrayCreate([0, 0], varSmallInt);
filterData := VarArrayCreate([0, 0], varVariant);
filterType[0] := 8; // 画層
filterData[0] := layerName; // 画層名
// フィルター作成例
// 画層が WIRE または、*SENBAN で 図形が、INSERT またはLINE
{
filterType := VarArrayCreate([0, 1], varSmallInt);
filterData := VarArrayCreate([0, 1], varVariant);
filterType[0] := 8; // 画層
filterData[0] := 'WIRE,*SENBAN'; // 画層名
filterType[1] := 0; // 図形
filterData[1] := 'INSERT,LINE'; // 図形名
selSet.SelectOnScreen(filterType, filterData);
ShowMessage('選択数= ' + IntToStr(selSet.Count));
}
// すべての図形から選択
// 引数省略は、EmptyParam を使う
selset.Select(acSelectionSetAll, EmptyParam, EmptyParam, filterType, filterData);
if selset.Count > 0 then begin
for i := 0 to selSet.Count - 1 do begin
// 図形を取得
ent := selset.Item(i);
// その矩形範囲を取得
ent.GetBoundingBox(vpt1, vpt2);
// 図形範囲の最小、最大を取得
if i = 0 then begin
minPoint := vpt1;
maxPoint := vpt2;
end
else begin
// 比較は、2D座標(x,y) のみ
for j := 0 to 1 do begin
if vpt1[j] < minPoint[j] then minPoint[j] := vpt1[j];
if vpt2[j] > maxPoint[j] then maxPoint[j] := vpt2[j];
end;
end;
end;
// その範囲をズーム
doc.Application.ZoomWindow(minPoint, maxPoint);
end;
selset.Clear;
end;
procedure LayerBlink(doc: IAcadDocument; const layerName: string);
var
i : integer;
lays : IAcadLayers;
lay : IAcadLayer;
begin
lays := doc.Layers;
for i := 0 to lays.Count - 1 do begin
if lays.Item(i).Name = layerName then begin
lay := lays.Item(i);
break;
end;
end;
if Assigned(lay) then begin
for i := 1 to 19 do begin
if i mod 2 = 0 then
// 赤色
lay.color := 1
else
// BYLAYER
lay.color := 255;
doc.Regen(0);
Sleep(50);
end;
end;
end;
procedure TForm3.ListBox1Click(Sender: TObject);
var
app : IAcadApplication;
doc : IAcadDocument;
s : string;
begin
try
if not Supports(GetActiveOleObject('BricscadApp.AcadApplication'), AcadApplication, app) then begin
ShowMessage('サポートされていません.');
exit;
end;
except
ShowMessage('有効な BricsCAD が見つかりません.');
exit;
end;
// ズーム画層名
with ListBox1 do s := Items[ItemIndex];
// アクティブドキュメントを取得
doc := app.ActiveDocument;
// 画層内の図形範囲をズーム
LayerZoom(doc, s);
doc.SetVariable('EXPERT', 5);
doc.SetVariable('CLAYER', s);
app.RunCommand('-LA OFF ZOOM_*' + #13);
app.RunCommand('ON ' + s + #13#13);
doc.SetVariable('EXPERT', 1);
end;
end.