得到图上的对象,使用控件提供的构造选择集功能,构造选择集类:MxDrawSelectionSet,详细帮助参考:http://www.mxdraw.com/help/IMxDrawSelectionSet.htm, 选择集类提供了得到图上所有对象,得到当前选择对象,得到指定范围内的对象函数,在得到对象的时还可以设置过滤条件,比如得到某类,某个图层上的对象。点击此处在线演示。
支持如下过滤条件:
| 参数类型 | 类型 | |
|---|---|---|
| RTDXF0 | TEXT | 文字 |
| MTEXT | 多行文字 | |
| CIRCLE | 圆 | |
| ARC | 圆弧 | |
| LINE | 线 | |
| LWPOLYLINE | 多段线 | |
| INSERT | 图块 | |
| ELLIPSE | 椭圆 | |
| SPLINE | 样条线 | |
| LinkLine | 超链接 | |
| 8 | 图层 | |
| 2 | 图块 | |
| -4 | 通配符 | |
| 62 | 颜色 | |
| -3 | 扩展数据 | |
颜色
实体的颜色可以通过0~256的数字值来指定和读取,也可以通过 McCmColor 类的实例来指定和读取,McCmColor类可以用来扩展颜色模型。McCmColor类可以用来表示真彩色中的任何一种色彩。
颜色值1~7代表的标准颜色如下:
| 颜色值 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 颜色 | 红 | 黄 | 绿 | 青 | 蓝 | 紫红 | 白或黑 |
颜色值7对应的颜色与控件背景颜色有关。如果背景是黑,则7对应的颜色是白,反之则对应的颜色是黑。
还有一些颜色值代表了一些特殊的含义:
0:指定实体的颜色为 BYBLOCK 。即实体继承当前块表记录中块参照的颜色值,如果实体直接处于模型空间或图纸空间块表记录中,则实体的颜色就是黑或白。
256:指定实体的颜色为 BYLAYER 。实体使用其所在层的颜色。
257:实体 无颜色 。这种情况仅在实体刚刚实例化,在被赋予0~256之间颜色值或被添加到数据库并使用数据库的当前颜色值之前才会出现。
主要用到函数说明:
IMxDrawSelectionSet::AllSelect
得到当前空间的所有实体。详细说明如下:
| 参数 | 说明 |
|---|---|
|
[in,defaultvalue(NULL)] IMxDrawResbuf* filterData |
过滤条件 |
js中使用如下:
function AllSelect() {
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//得到当前空间的所有实体
ss.AllSelect (spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}主要用到函数说明:
IMxDrawSelectionSet::Select2
构造选择集。详细说明如下:
| 参数 | 说明 |
|---|---|
[in] MCAD_McSelect Mode | 构造选择集方式 |
[in] VARIANT point1 | 构造择择集时需要使用到的点对象 |
[in] VARIANT point2 | 构造择择集时需要使用到的点对象 |
[in,optional] VARIANT filterType | 构造选择集的过滤数据的类型 |
[in,optional] VARIANT filterData | 构造选择集的过滤数据 |
可以取如下值 | mcSelectionSetWindow = 0, mcSelectionSetCrossing = 1, mcSelectionSetFence = 2, mcSelectionSetPrevious = 3, mcSelectionSetLast = 4, mcSelectionSetAll = 5, 选择图面上的所有实体 mcSelectionSetWindowPolygon = 6, mcSelectionSetCrossingPolygon = 7, mcSelectionSetUserSelect = 8 mcSelectionImpliedSelectSelect = 9,_I 返回当前图上已经选择的实体 |
js中使用如下:
function SelectSetAll() {
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//用户选择对象 得到用户选取的实体
ss.Select2(5,null, null, null,spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}主要用到函数说明:
IMxDrawSelectionSet::Select
构造选择集。详细说明如下:
| 参数 | 说明 |
|---|---|
[in] MCAD_McSelect Mode | 构造选择集方式 |
[in] VARIANT point1 | 构造择择集时需要使用到的点对象 |
[in] VARIANT point2 | 构造择择集时需要使用到的点对象 |
[in,optional] VARIANT filterData | 构造选择集的过滤数据 |
可以取如下值 | mcSelectionSetWindow = 0, mcSelectionSetCrossing = 1, mcSelectionSetFence = 2, mcSelectionSetPrevious = 3, mcSelectionSetLast = 4, mcSelectionSetAll = 5, 选择图面上的所有实体 mcSelectionSetWindowPolygon = 6, mcSelectionSetCrossingPolygon = 7, mcSelectionSetUserSelect = 8 mcSelectionImpliedSelectSelect = 9,_I 返回当前图上已经选择的实体 |
js中使用如下:
function SelectWindow()
{
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//定义两个点的位置
//定义第一个点的位置
var vPt1 = mxOcx.NewPoint();
vPt1.x = -20;
vPt1.y = -20;
//定义第二个点的位置
var vPt2 = mxOcx.NewPoint();
vPt2.x = 20;
vPt2.y = 20;
//选取跨范围的实体
ss.Select(0, vPt1, vPt2,spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}js中使用如下:
function SelectCross()
{
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//定义两个点的位置
//定义第一个点的位置
var vPt1 = mxOcx.NewPoint();
vPt1.x = -20;
vPt1.y = -20;
//定义第二个点的位置
var vPt2 = mxOcx.NewPoint();
vPt2.x = 20;
vPt2.y = 20;
//选取跨范围的实体
ss.Select(1, vPt1, vPt2,spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}js中使用如下:
function SelectUserSelect()
{
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//用户选择对象 得到用户选取的实体
ss.Select2(8, null, null, null, spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}js中使用如下:
function SelectImpliedSelectSelect()
{
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//用户选择对象 得到用户选取的实体
ss.Select2(9, null, null,null,spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}主要用到函数说明:
IMxDrawSelectionSet::CurrentSelect
得到当前已经选择的实体。详细说明如下:
| 参数 | 说明 |
|---|---|
|
filterData |
过滤条件 |
js中使用如下:
function CurrentSelect() {
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
ss.CurrentSelect(spFilte);
var i = 0;
for (; i < ss.Count; i++) {
var ent = ss.Item(i);
if (ent.ObjectName == "McDbLine") {
// 是个直线。
var spt = ent.StartPoint;
var ept = ent.EndPoint;
alert(spt.x);
}
else if (ent.ObjectName == "McDbPolyline") {
// 是个多义线.
var j = 0;
// 循环,得到端点坐标
for (j = 0; j < ent.NumVerts; j++) {
var pt = ent.GetPointAt(j);
alert(pt.x);
}
}
}
}js中使用如下:
function SelectAssign() {
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
// "0",是图层名,8是DXF码,代表"0"是个图层字符串。
// 选择 0层上的实体。
spFilte.AddStringEx("0", 8);
// 选择直线或圆弧实体。5020是DXF码,代表"LINE"是类型字符串。
spFilte.AddStringEx("LINE,ARC", 5020);
// 选择红色的实体。1为颜色索引值,代表红色。 62是DXF码,但1是个颜色类型。
spFilte.AddLongEx(1,62);
ss.Select2(5,null, null, null,spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}主要用到函数说明:
IMxDrawSelectionSet::SelectAtPoint
在一个点构造选择集。详细说明如下:
| 参数 | 说明 |
|---|---|
|
[in] IMxDrawPoint* point |
点坐标 |
|
[in,defaultvalue(NULL)] IMxDrawResbuf* filterData |
过滤条件 |
js中使用如下:
function SelectAtPoint()
{
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//在一个点构造选择集
var vPt = mxOcx.Call("Mx_NewPoint","");
var vPt = mxOcx.NewPoint();
vPt.x = -20;
vPt.y = -20;
ss.SelectAtPoint (vPt, spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}主要用到函数说明:
IMxDrawSelectionSet::SelectByPolygon
在多个点组合的闭合区域里,构造选择集。详细说明如下:
| 参数 | 说明 |
|---|---|
[in] IMxDrawPoints* points | 组成闭合区域的点集合 |
[in,defaultvalue(NULL)] IMxDrawResbuf* filterData | 过滤条件 |
Mode | 构造选择集方式 |
js中使用如下:
function SelectByPolygon(){
var pt1 = mxOcx.NewPoint();
pt1.x = -200;
pt1.y = -200;
var pt2 = mxOcx.NewPoint();
pt2.x = 200;
pt2.y = 200;
var pt3 = mxOcx.NewPoint();
pt3.x = 200;
pt3.y = -200;
var pt4 = mxOcx.NewPoint();
pt4.x = -200;
pt4.y = 200;
var points = mxOcx.NewComObject("IMxDrawPoints");
points.Add2(pt1);
points.Add2(pt2);
points.Add2(pt3);
points.Add2(pt4);
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//在多个点组合的闭合区域里,构造选择集
ss.SelectByPolygon(7,points, spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
alert(ent.ObjectName);
}
}主要用到函数说明:
_DMxDrawX::CreateGroup
创建组.如果组名已经存在,就把实体加入组中。详细说明如下:
| 参数 | 说明 |
|---|---|
BSTR pszName | 组名.,如果为空,创建匿名组 |
IDispatch* pAryId | 创建成组的实体id数组,是IMxDrawResbuf类 |
js代码实现如下:
function CreateGroup() {
mxOcx.Prompt("选择要做成组的实体:");
var ss = mxOcx.NewSelectionSet();
ss.Select2(8, null, null, null);
var param = mxOcx.NewResbuf();
for(var i = 0; i < ss.Count;i++)
{
var ent = ss.Item(i);
if(ent == null)
continue;
param.AddObjectId(ent.ObjectID);
}
if(param.Count == 0)
return;
mxOcx.CreateGroup("", param);
}主要用到函数说明:
_DMxDrawX::DeleteGroup
根据组名,删除组。详细说明如下:
| 参数 | 说明 |
|---|---|
|
BSTR pszName |
组名 |
js代码实现如下:
function DelGroup() {
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];
}
mxOcx.DeleteGroup(txt);
alert("成功删除组");
}主要用到函数说明:
_DMxDrawX::GetAllGroupName
得到所有组名。
js代码实现如下:
function GetAllGroup() {
//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
ss.Select2(5,null, null, null,spFilte);
var val = mxOcx.GetAllGroupName();
for(var i = 0;i < ss.Count; i++ ){
var ent = ss.Item(i);
if(ent == null)
continue;
alert(val.AtString(i));
}
}