明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 780|回复: 8

[提问] 创建扩展数据库失败

[复制链接]
发表于 2025-8-5 10:07:08 | 显示全部楼层 |阅读模式
请教一下,创建扩展数据库,最后一步为什么返回nil呢,哪里错了。代码如下
(progn
    (setq ss (ssget))
    (setq ename (ssname ss 0))
    (setq vname (vlax-ename->vla-object ename))
    (setq datatype (vlax-make-safearray vlax-vbInteger '(0 . 4)))
    (vlax-safearray-fill datatype '(1001 1000 1000 1040 1040))
    (setq data (vlax-make-safearray vlax-vbvariant '(0 . 4)))
    (vlax-safearray-fill data '("hello" "abc" "hello" 12.5 12.6))
    (vla-setxdata vname datatype data)
)

回复

使用道具 举报

发表于 2025-8-5 14:13:27 | 显示全部楼层
函数(vla-getxdata)(vla-setxdata)的返回值都是nil,你代码已经把扩展数据写入对象,可以用(vla-getxdata)读取一下。
回复 支持 反对

使用道具 举报

发表于 2025-8-6 16:15:58 | 显示全部楼层
不会是AI给的代码吧,第一次见到。
我只会用entget  然后加入扩展组码,再entmod
回复 支持 反对

使用道具 举报

发表于 2025-8-6 17:16:13 | 显示全部楼层
本帖最后由 yanshengjiang 于 2025-8-6 17:36 编辑

没问题,可以正常添加。  测试发现这种方式不需要提前注册扩展名。

(progn
    (setq ss (ssget))  ; 让用户选择对象
    (if ss  ; 增加判断,避免未选择对象时出错
        (progn
            (setq ename (ssname ss 0))  ; 获取第一个对象的实体名
            (setq vname (vlax-ename->vla-object ename))  ; 转换为VLA对象
            
            ; 1. 修改:使用带前缀的自定义应用程序名(降低冲突风险)
            ; 建议格式:公司/个人标识 + 功能标识(如"MYCOMPANY_CLEAN")
            (setq datatype (vlax-make-safearray vlax-vbInteger '(0 . 4)))
            (vlax-safearray-fill datatype '(1001 1000 1000 1040 1040))
            
            ; 2. 对应修改数据数组中的应用程序名
            (setq data (vlax-make-safearray vlax-vbvariant '(0 . 4)))
            (vlax-safearray-fill data '("SOUTH" "abc" "hello" 12.5 12.6))  ; 替换为"MYAPP_CUSTOM"
            
            (vla-setxdata vname datatype data)  ; 添加XData
            (princ "XData添加成功!")
        )
        (princ "未选择任何对象,操作取消。")
    )
    (princ)  ; 清除命令行多余输出
)



我的南方cass默认注册了south扩展名。



命令: (ASSOC -3(entget(car(entsel)) '("SOUTH")))

选择对象: (-3 ("SOUTH" (1000 . "abc") (1000 . "hello") (1040 . 12.5) (1040 . 12.6)))
回复 支持 反对

使用道具 举报

发表于 2025-8-6 17:24:15 | 显示全部楼层
命令: (nth 4 (vlax-safearray->list (progn (vla-getxdata (vlax-ename->vla-object (car (entsel))) "SOUTH" 'a 'b) b)))
选择对象: #<variant 5 12.6>
回复 支持 反对

使用道具 举报

发表于 2025-8-6 17:27:01 | 显示全部楼层

命令: (vlax-variant-value (nth 4 (vlax-safearray->list (progn (vla-getxdata (vlax-ename->vla-object (car (entsel))) "SOUTH" 'a 'b) b))))
选择对象: 12.6
回复 支持 反对

使用道具 举报

发表于 2025-8-6 17:28:55 | 显示全部楼层
命令: (vlax-safearray->list (progn (vla-getxdata (vlax-ename->vla-object (car (entsel))) "SOUTH" 'a 'b) b))

选择对象: (#<variant 8 SOUTH> #<variant 8 abc> #<variant 8 hello> #<variant 5 12.5> #<variant 5 12.6>)
回复 支持 反对

使用道具 举报

发表于 2025-8-6 17:34:22 | 显示全部楼层
最后才发现,这个方式不需要注册扩展名。  随便取个名字他都能正确添加扩展属性。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-12 07:53 , Processed in 0.164504 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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