明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1897|回复: 17

[提问] vla-select如何利用组码过滤选择扩展数据(-3 (“扩展”))

[复制链接]
发表于 2024-4-22 14:34:55 | 显示全部楼层 |阅读模式
本帖最后由 bloodtempt 于 2024-4-22 14:36 编辑

lisp可以通过(ssget "x" '((0 . "INSERT")(-3 ("扩展"))))选取组码中含有“扩展”的图元
vlisp如何实现  我根据lisp格式创建变体  选择不到 不知道为什么

我想用创建一个字符串变体
(setq var
(vlax-make-variant
  (vlax-SafeArray-Fill
   (vlax-make-safearray vlax-vbString '(0 . 0) '(0 . 0))
       (("扩展"))
   )
)
)
把这个字符串在转变成vlax-vbvariant变体,未成功,请大神门指教一下。
        (vla-Select
    ssetObj
    ACSelectionSetAll
    nil
    nil
        (vlax-SafeArray-Fill
                (vlax-Make-SafeArray
                        vlax-vbInteger
                        (cons 0 0)
                )
                ‘(-3)
        )
        (vlax-SafeArray-Fill
                (vlax-Make-SafeArray
                        vlax-vbvariant
                        (cons 0 0)
                )
                (list var)
        )
)
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-4-22 15:01:03 | 显示全部楼层
vla函数太晦涩了,直接用ssget过滤不就好啦
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-5-5 07:38:52 | 显示全部楼层
本帖最后由 bloodtempt 于 2024-6-14 22:43 编辑

筛选扩展数据
  
扩展数据是字符串、数据、三维点、距离、层名,或者是其他附加在对象上得数据,特别是由外部应用程序附加到对象上得数据。
  
扩展数据大小为16KB
  
通过指定,我们可以为一个特殊的应用程序使用-3组码在筛选表中指定扩展数据来检索扩展数据。例如:,函数acedSSGet()返回一个以指定名字注册的带扩展数据的实体。acedSSGet()不检索每个扩展数据项(组码的范围为10002000)。
  
下面程序用于选择所有带有扩展数据的圆(Circle),应用程序为这些扩展数据注册的一个标志符(ID)为“APPNAME”。
  
  
  
eb1.restype=0;//实体类型
  
strcpy(sbuf1,”CIRCLE”);
  
eb1.resval.rstring=sbuf1;//实体为CIRCLE
  
eb1.rbnext=&eb2;
  
eb2.restype=-3;//扩展数据
  
eb2.rbnext=&eb3;
  
eb3.restype=1001;
  
strcpy(sbuf2,”APPNAME”);
  
eb3.resval.rstring=sbuf2;//APPNAME应用程序
  
eb3.rbnext=NULL;
  
//选择注册到APPNAME应用程序中的圆的扩展数据
  
acedSSGet(“X”,NULL,NULL,&eb1,ssname1);
  
如果不止一个应用程序名包含在表中,则acedSSGet()在选择集中所包含实体,必须对所有指定的应用程序都有扩展数据。比如,下面的程序选择带有注册到“APP1”和“APP2”中的扩展数据的圆
  
  
  
Code highlighting  produced by Actipro CodeHighlighter  (freeware)http://www.CodeHighlighter.com/--> 1 eb1.restype=0;//实体类型
  
strcpy(sbuf1,”CIRCLE”);
  
eb1.resval.rstring=sbuf1;//
  
eb1.rbnext=&eb2;
  
  
eb2.restype=-3;//扩展数据
  
eb2.rbnext=&eb3;
  
eb3.restype=1001;
  
strcpy(sbuf2,”APP1”);
  
eb2.resval.restring=sbuf2;//应用程序APP1
  
eb2.rbnext=&eb4;
  
eb4.restype=1001;//扩展数据
  
strcpy(sbuf3,”APP2”);
  
eb4.resval.rstring=sbuf3;//应用程序APP2
  
eb4.rbnext=NULL;
  
//选择注册应用程序APP1APP2的圆扩展数据

acedSSGet(“X”,NULL,NULL,&eb1,ssname1);


[size=13.3333px](setq app1 (vlax-make-safearray
        vlax-vbInteger
        '(0 . 0)
))
(vlax-SafeArray-Fill app1 (list 1001))
(setq app2 (vlax-make-safearray
        vlax-vbString
        '(0 . 0)
))
(vlax-SafeArray-Fill app2 (list "FrameHandle"))
(setq app3 (vlax-make-safearray
        vlax-vbVariant
        '(0 . 1)
))
(vlax-SafeArray-Fill app3 (list app1 app2))
(setq Filter (list (cons 0 "INSERT") (list -3 (list app3))))
(vla-Select
    ssetObj
    ACSelectionSetAll
    nil
    nil
    (if Filter (List->VarArray (mapcar 'car Filter) vlax-vbInteger))
    (if Filter (List->VarArray (mapcar 'cdr Filter) vlax-vbvariant))
[size=13.3333px])
TypedValue.TypeCode 属性是一个16位整型数据,它指明 TypedValue.Value 属性的数据类型,可接受的 TypeCode 值取决于 ResultBuffer 实例的使用范围。
创建 ResultBuffer 方法有两种:
           1.一种是使用构造函数创建,即在声明 ResultBuffer 时将一个 TypedValue 作用参数传给 ResultBuffer:
           2.另一种是使用 ResultBuffer.Add() 方法来添加 TypedValue,可以添加多个TypedValue,但总数据大小不能超过128K:
                                                      ResultBuffer resBuf = new ResultBuffer();     
                                                      resBuf.Add(new TypedValue(1001, "appname"));    //必须放在第一条添加,否则会报错 
                                                      resBuf.Add(new TypedValue(1000, "作者:王"));
                                       注意// resBuf 必须包含 1001 对应的值 就是应用程序名称
                                                      ResultBuffer  resBuf = new ResultBuffer(new TypedValue((int)DxfCode.Text, "我的扩展数据"));

发表于 2024-4-23 08:50:09 | 显示全部楼层
bloodtempt 发表于 2024-4-23 04:17
我根据编码10推应该是两层表的  构建的都是cdr的数据
要不改成这样   
(setq var
(vlax-make-variant
  (vlax-SafeArray-Fill
   (vlax-make-safearray vlax-vbstring '(0 . 0) '(0 . 0))
       '(("扩展数据"))
   )
)
)
发表于 2024-4-22 15:05:37 | 显示全部楼层
ssyfeng 发表于 2024-4-22 15:01
vla函数太晦涩了,直接用ssget过滤不就好啦

哈哈, 我也问过。你这口气 ,这回复,同晓东老大一样。

点评

大佬不要这么说  发表于 2024-4-22 15:14
 楼主| 发表于 2024-4-22 15:07:42 | 显示全部楼层
ssyfeng 发表于 2024-4-22 15:01
vla函数太晦涩了,直接用ssget过滤不就好啦

有时候ssget不是那么方便  多文档操作的时候局限性太大
 楼主| 发表于 2024-4-22 15:10:52 | 显示全部楼层
自贡黄明儒 发表于 2024-4-22 15:05
哈哈, 我也问过。你这口气 ,这回复,同晓东老大一样。

研究出什么如何能选到了么
发表于 2024-4-22 15:23:30 | 显示全部楼层
vla-select没有这个函数吧?
发表于 2024-4-22 15:34:08 | 显示全部楼层
树櫴希德 发表于 2024-4-22 15:23
vla-select没有这个函数吧?

这个可以有
 楼主| 发表于 2024-4-22 15:43:14 | 显示全部楼层
有知道的麻烦告诉一声 要不只能曲线救国了
发表于 2024-4-22 17:19:15 | 显示全部楼层
发表于 2024-4-22 17:21:38 | 显示全部楼层
lisp就不要在乎怎么用了,你换c#/arx就说可以构造索引,获取内容.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 18:18 , Processed in 0.186376 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表