|
www.mxdraw.com
|
控件的数据库对象,图形中的所有信息都存放在该对象中 注意:在一些具有内存自动回收的语言中使用控件,因回收的事件不确定,容易引起错误, 对控件的一些对象需要显示释放内存。比如,所有遍历器对象,MxDrawResbuf对象。 如C#语言: 调用代码如下 System.Runtime.InteropServices.Marshal.ReleaseComObject(iter); Js语言: 代码如下: iter = null; CollectGarbage(); 支持扩展属性"GetVariable,系统变量名",得到系统变量;
[ object, uuid(302F93D2-04D6-44CB-A4D7-57649DE748C4), dual, nonextensible, helpstring("IMxDrawDatabase interface"), pointer_default(unique) ]
interface IMxDrawDatabase : IMxDrawMcRxObject;MxDrawDatabase.idl
例如: C#读取OSMDOE系统变量值
MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
MxDrawResbuf val = database.GetProp("GetVariable,OSMODE");
if (val != null)
{
MessageBox.Show(val.AtLong(0).ToString());
}支持扩展属性"title",类型为: CString,得到函数:getTitle,设置函数setTitle;
例如: C#读写 dwg文件的标题.
MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
MxDrawResbuf param = new MxDrawResbuf();
param.AddString("MyTitleVal");
// 设置dwg文件说明信息标题为"MyTitleVal"
database.SetProp("setTitle", param);
// 取dwg文件说明信息标题.
MxDrawResbuf ret = database.GetProp("getTitle");
MessageBox.Show(ret.AtString(0) );
例如:VB6代码,得到图纸空间中所有实体
'得到当前图纸空间中所有实体的代码演示
'当前的图纸空间
Dim curSpace8 As MxDrawXLib.MxDrawBlockTableRecord
Set curSpace8 = app.WorkingDatabase.CurrentSpace
' 工具对象,用于向命令行输入出字符串
Dim mxUtility8 As MxDrawXLib.MxDrawUtility
Set mxUtility8 = New MxDrawXLib.MxDrawUtility
'遍历器,用于遍历当前图纸空间中所有的实体
Dim iter As MxDrawXLib.MxDrawBlockTableRecordIterator
Set iter = curSpace8.NewIterator
Dim ptDim1 As MxDrawXLib.MxDrawPoint
Dim ptDim2 As MxDrawXLib.MxDrawPoint
If (iter Is Nothing) Then
Exit Sub
End If
'循环得到所有实体
Do While iter.Done = False
' 得到遍历器当前的实体
Dim ent8 As MxDrawXLib.MxDrawEntity
Set ent8 = iter.GetEntity()
If (ent8 Is Nothing) = False Then
If TypeOf ent8 Is MxDrawXLib.MxDrawText Then
'当前实体是个文字实体
Dim text8 As MxDrawXLib.MxDrawText
Set text8 = ent8
mxUtility8.Prompt Chr(13) + Chr(10) + text8.TextString
ElseIf TypeOf ent8 Is MxDrawXLib.MxDrawPolyline Then
'当前实体是一个多义线
Dim polyline As MxDrawXLib.MxDrawPolyline
Set polyline = ent8
mxUtility8.Prompt Chr(13) + Chr(10) + "发现Polyline曲线, 下面是它的坐标信息:"
'得到Polyline的端点坐标
Dim iNum As Long
iNum = 0
Do While iNum < polyline.NumVerts
Dim tmpPt As MxDrawXLib.MxDrawPoint
Set tmpPt = polyline.GetPointAt(iNum)
mxUtility8.Prompt Chr(13) + Chr(10) + "坐标为x:" & tmpPt.x & "y:" & tmpPt.y & "凸度为:" & polyline.GetBulgeAt(iNum)
iNum = iNum + 1
Loop
ElseIf TypeOf ent8 Is MxDrawXLib.MxDrawDimAligned Then
Dim dimAligned8 As MxDrawXLib.MxDrawDimAligned
Set dimAligned8 = ent8
mxUtility8.Prompt Chr(13) + Chr(10) + dimAligned8.DimensionText
'当DimensionText返回为空时,可以用下面的ptDim1,ptDim2两点的距离算出标注内容。
Set ptDim1 = dimAligned8.XLine1Point
Set ptDim2 = dimAligned8.XLine2Point
ElseIf TypeOf ent8 Is MxDrawXLib.MxDrawDimRotated Then
Dim dimRotated8 As MxDrawXLib.MxDrawDimRotated
Set dimRotated8 = ent8
mxUtility8.Prompt Chr(13) + Chr(10) + dimRotated8.DimensionText
'当DimensionText返回为空时,可以用下面的ptDim1,ptDim2两点的距离算出标注内容。
Set ptDim1 = dimRotated8.XLine1Point
Set ptDim2 = dimRotated8.XLine2Point
' ElseIf TypeOf ent8 Is 其它类型 Then
' ... ...
End If
End If
iter.Step
Loop例如:C#代码,得到图纸空间中所有实体
private void GetAllEntity() { try { MxDrawApplication app = new MxDrawApplication(); MxDrawUtility mxUtility = new MxDrawUtility(); // 得到当前图纸空间 MxDrawBlockTableRecord blkRec = app.WorkingDatabase().CurrentSpace(); // 创建一个用于遍历当前图纸空间的遍历器 MxDrawBlockTableRecordIterator iter = blkRec.NewIterator(); if (iter == null) return; // 所有实体的id数组。 List<Int32> aryId = new List<Int32>(); int iLineNum = 0; // 循环得到所有实体 for (; !iter.Done(); iter.Step(true, false)) { // 得到遍历器当前的实体 MxDrawEntity ent = iter.GetEntity(); if (ent == null) continue; // 得到实体的id aryId.Add(ent.ObjectID); if (ent is MxDrawLine) { // 当前实体是一个直线 MxDrawLine line = (MxDrawLine)ent; iLineNum++; } else if (ent is MxDrawBlockReference) { // 当前实体是一个块引用 MxDrawBlockReference blkRef = (MxDrawBlockReference)ent; for (int j = 0; j < blkRef.AttributeCount; j++) { // 得到块引用中所有的属性 MxDrawAttribute attrib = blkRef.AttributeItem(j); mxUtility.Prompt("n Tag: " + attrib.Tag + "Text:" + attrib.TextString); } } // else if (ent is 其它类型) //{ // ... .... //} } String sT; sT = "发现" + aryId.Count + "个实体,其中有" + iLineNum + "个直线"; MessageBox.Show(sT); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } // 需要显示释放递代器. System.Runtime.InteropServices.Marshal.ReleaseComObject(iter); }
例如:Delphi中的例程,遍历图中的所有实体,找到块名为A23TIT_KH的图块,并得到它的属性
procedure TForm1.Button1Click(Sender: TObject);
var
curDababase : IMxDrawDatabase;
modleSpace : IMxDrawBlockTableRecord ;
newIterator : IMxDrawBlockTableRecordIterator ;
pEnt : IMxDrawEntity;
pBlkRef : IMxDrawBlockReference;
pAttribute : IMxDrawAttribute;
tag : WideString;
text : WideString;
ii : Integer;
fModel : WideString;
fTitle : WideString;
fDwgNo : WideString;
fMaterial : WideString;
fQuantity : WideString;
fRemark : WideString;
fDrawData : WideString;
fScale : WideString;
fVersion : WideString;
fReview : WideString;
fDrawName : WideString;
fApprove : WideString;
begin
curDababase := MxDrawApplication1.WorkingDatabase;
modleSpace := curDababase.CurrentSpace ;
newIterator := modleSpace.NewIterator ;
if newIterator <> nil then
begin
while newIterator.Done() = False do
begin
pEnt := newIterator.GetEntity();
newIterator.Step(True,False);
if pEnt <> nil then
begin
pEnt.QueryInterface(IMxDrawBlockReference, pBlkRef);
if pBlkRef <> nil then
begin
if pBlkRef.GetBlockName() = 'A23TIT_KH' then
begin
for ii := 0 to pBlkRef.AttributeCount -1 do
begin
pAttribute := pBlkRef.AttributeItem(ii);
tag := pAttribute.Get_Tag();
text := pAttribute.Get_TextString();
showmessage(tag + ':' + text);
case ii of
0: fModel := text;
1: fTitle := text;
2: fDwgNo := text;
3: fMaterial := text;
4: fQuantity := text;
5,6,7: fRemark := fRemark + text + ' ';
8: fDrawData := text;
9: fScale := text;
10: fVersion := text;
11: fReview := text;
12: fDrawName := text;
13: fApprove := text;
end;
end;
end;
end;
end;
end;
end;
if text = '' then
begin
showmessage('没有发现块名为' + 'A23TIT_KH' + '的块实体');
end;
end;例如: JS代码
function GetAllEntity()
{
var axMxDrawX1 = document.getElementById("MxDrawXCtrl");
// 得到当前图纸空间
var blkRec = axMxDrawX1.GetDatabase().CurrentSpace();
// 创建一个用于遍历当前图纸空间的遍历器
var iter = blkRec.NewIterator();
var iNum = 0; // 循环得到所有实体
if (iter!= null)
{
for (; !iter.Done(); iter.Step(true, false))
{
iNum++;
// 得到遍历器当前的实体
var ent = iter.GetEntity();
if (ent.ObjectName == "McDbLine")
{
// var line = ent;// 当前实体是一个直线
;
}
else if (ent.ObjectName=="McDbBlockReference")
{
MxDrawBlockReference blkRef = ent;// 当前实体是一个块引用
for (var j = 0; j < blkRef.AttributeCount; j++)
{
// 得到块引用中所有的属性
var attrib = blkRef.AttributeItem(j);
mxUtility.Prompt("n Tag: " + attrib.Tag + "Text:" + attrib.TextString);
}
}
// else if (ent is 其它类型)
//{
// ... ....
//}
}
}
var sT;
sT = "发现" + iNum + "个实体";
alert(sT);
// 注意需要显示释放递代器.,不然会引起错误
iter = null;
CollectGarbage();
}例如: JS 查找图上,某个文字,并定位过去
function FindText() {
var winWidth = 440;
var winHeight = 140;
var winLeft = (screen.width - winWidth) / 2;
var winTop = (screen.height - winHeight) / 2 - 20;
var str = 'dialogHeight:' + winHeight + 'px;dialogWidth:' + winWidth + 'px;dialogTop:' + winTop + 'px;dialogLeft:' + winLeft + 'px;resizable:yes;center:yes;status:no;'
var rt = window.showModalDialog("Gettext.htm?tmp=" + Math.random(), "输入文字", str);
var txt;
if (typeof (rt) == "undefined") {
return;
} else {
var arr = rt.split(",");
txt = arr[0];
}
var ss = mxOcx.NewSelectionSet();
var spFilte = mxOcx.NewResbuf();
// 把文字对象,当着过滤条件.
spFilte.AddStringEx("TEXT",5020);
// 得到图上,所有文字对象.
ss.Select2(5,null,null,null,spFilte);
// 遍历每个文字.
var bFind = false;
for(var i = 0; i < ss.Count;i++)
{
var ent = ss.Item(i);
if(ent == null)
continue;
if(ent.ObjectName != "McDbText")
continue;
var sTxt = ent.TextString;
if (sTxt == txt) {
// 把文字放到视区中间.
mxOcx.PutEntityInView(ent.ObjectID, 300);
var dLen = mxOcx.ViewLongToDocCoord(80);
// 绘制一个标记圆.
mxOcx.DrawVectorCircle(ent.Position.x,
ent.Position.y,
dLen, 65280);
bFind = true
}
ent = null;
}
if (!bFind) {
alert("没有找到文字对象");
}
// 在这里必须显示释放控件的COM对象指针.
ss = null;
spFilte = null;
CollectGarbage();
}例如:VC代码,找到图上某个文字
void CTestOcxForVc6Dlg::FindText(CString sText) { MxDrawXLib::IMxDrawSelectionSetPtr ssGet; ssGet.CreateInstance(__uuidof( MxDrawXLib::MxDrawSelectionSet )); if(ssGet == NULL) { return; } ssGet->Select(MxDrawXLib::mcSelectionSetAll); if(ssGet->GetCount() == 0) return; for(long i = 0; i < ssGet->GetCount();i++) { MxDrawXLib::IMxDrawEntityPtr spEnt = ssGet->Item(i); if(spEnt == NULL) continue; CComPtr<IMxDrawText> spText; spEnt->QueryInterface(&spText); CComPtr<IMxDrawMText> spMText; spEnt->QueryInterface(&spMText); if(spText != NULL) { // 是一个文字. CString sVal; _bstr_t sBstr= spText->GetTextString(); sVal= CString(LPCTSTR(sBstr) ); if(sVal.Find(sText) != -1) { // 找到要找的文字. m_ocx.TwinkeEnt(spEnt->ObjectID); return; } } else if(spMText != NULL) { // 是个多行文字. CString sVal; _bstr_t sBstr = spMText->GetContents(); sVal= CString(LPCTSTR(sBstr) ); if(sVal.Find(sText) != -1) { // 找到要找的文字. m_ocx.TwinkeEnt(spEnt->ObjectID); return; } } } }
例如: VC, 查找图上文字,找到文字内空为"AAA"的文字,并把文字放到视区中间,使用标记圆标出.
IMxDrawSelectionSetPtr ss;
ss.CreateInstance(__uuidof( MxDrawXLib::MxDrawSelectionSet ));
IMxDrawResbufPtr spFilte;
spFilte.CreateInstance(__uuidof( MxDrawXLib::MxDrawResbuf ));
// 把文字对象,当着过滤条件.
spFilte->AddStringEx("TEXT",5020);
// 得到图上,所有文字对象.
ss->Select(mcSelectionSetAll,NULL,NULL,spFilte);
// 遍历每个文字.
for(long i = 0; i < ss->Count;i++)
{
IMxDrawEntityPtr ent = ss->Item(i);
if(ent == NULL)
continue;
IMxDrawTextPtr spTxt;
ent->QueryInterface(&spTxt);
if(spTxt == NULL)
continue;
CString sTxt = spTxt->TextString;
if(sTxt == "AAA")
{
// 把文字放到视区中间.
m_ocx.PutEntityInView(spTxt->ObjectID,300);
double dLen = m_ocx.ViewLongToDocCoord(80);
// 绘制一个标记圆.
m_ocx.DrawVectorCircle(spTxt->Position->x,
spTxt->Position->y,
dLen, 65280);
}
}