找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3493|回复: 17

[教学] 【AcBr库应用(三)】给3DSOLID每个面设置不同的颜色

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2018-5-28 15:43:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我们知道,CAD里面是没有命令可以将3DSOLID每个面设置不同的颜色的,我们可以通过ACBR API做到。

使用ACBRAPI,遍历每个面(FACE),然后通过子实体路径的子实体ID设置每个面的颜色

3dsolid-color.gif

下面是ARX代码:

[C++] 纯文本查看 复制代码
void TestBrep(void) 
{ 
    Adesk::Int32 len; 
    ads_name  ssname0; 
  struct resbuf *buffer; 
    buffer = acutBuildList(-4, _T("<AND"), 
              RTDXF0, _T("3DSOLID"), 
              -4, _T("AND>"), RTNONE); 
    acutPrintf(_T("\nSelect a box:")); 
    acedSSGet(NULL, NULL, NULL, buffer, ssname0); 
   acutRelRb(buffer); 
  if (RTNORM == acedSSLength(ssname0, &len)) 
    { 
        ads_name  ent; 
        AcDbObjectId entId; 
    for(long k = 0; k < len; k++) 
        { 
            acedSSName(ssname0, k, ent); 
            acdbGetObjectId(entId, ent); 
      settingDifferentColorToEachFace(entId); 
        } 
        acedSSFree(ssname0); 
    } 
} 

void settingDifferentColorToEachFace(AcDbObjectId solidId) 
{ 
  AcCmColor specialColor; 
  AcDb3dSolid* pSolid; 
    if (Acad::eOk == acdbOpenObject(pSolid, solidId, AcDb::kForRead)) 
    { 
        AcDbFullSubentPath path(solidId, AcDbSubentId()); 
    AcBrBrep brep; 
        AcBr::ErrorStatus bs = brep.setSubentPath(path); 
        if (bs != AcBr::eOk) 
            return; 
   //Initialize the BrepFace traverser 
        AcBrBrepFaceTraverser bft; 
        bs = bft.setBrep(brep); 
        if (bs != AcBr::eOk) 
            return;  
        AcArray<AcDbSubentId> arrSubentId; 
        // Traverse all faces 
        for (;!bft.done();bft.next()) 
        { 
            AcBrFace face; 
            bs = bft.getFace(face);     
            if (bs != Acad::eOk) 
            { 
                acutPrintf(L"\ngetFace failed"); 
                break; 
            } 
            AcDbFullSubentPath    Path(kNullSubent); 
            AcDbSubentId          subentId; 
            AcBr::ErrorStatus bss = face.getSubentPath(Path); 
            subentId = Path.subentId(); 
            arrSubentId.append(subentId); 
        } 
        pSolid->upgradeOpen(); 
        for (int i = 0; i < arrSubentId.length(); i++) 
        { 
      specialColor.setColorIndex(i); 
            pSolid->setSubentColor(arrSubentId[i],specialColor); 
        } 
        pSolid->downgradeOpen(); 
    } 
    pSolid->close(); 
} 




下面是XDRX API的AcBr库函数实现的LISP代码:

  1. (defun c:tt ()
  2.   (defun _traversface (e)
  3.     (setq br (xdbr::constructor e))
  4.     (setq tr (xdbr::constructor "brepfacetraverser" br))
  5.     ;;FACE遍历
  6.     (setq ids nil)
  7.     (while (not (xdbr::traverser:done tr));遍历面
  8.       (if (setq face (xdbr::getpropertyvalue tr "face"));获得当前遍历指针位置的面AcBrFace
  9.         (progn (setq SubEntPath (xdbr::getpropertyvalue face "subentpath");获得面的子实体路径
  10.                      SubEntId   (xdrx_getpropertyvalue SubEntPath "subentid");;获得子实体ID
  11.                      ids        (cons SubEntId ids);保存到全局表
  12.                )
  13.                (xdrx_object_release SubEntPath);;释放子实体路径变量
  14.         )
  15.       )
  16.       (xdbr::traverser:next tr);;遍历器指向下个位置
  17.     )
  18.     (xdrx_object_release tr br);;释放遍历器和BREP变量
  19.     (setq i 0)
  20.     (repeat (length ids);设置子实体面颜色
  21.       (xdrx_setpropertyvalue
  22.         e
  23.         "subentcolor"
  24.         (list (setq SubEntId (nth i ids)) (setq i (1+ i)))
  25.       )
  26.       (xdrx_object_release SubEntId);;释放子实体ID变量
  27.       (xdrx_prompt
  28.         (xdrx_string_format "\n - 面[%d]-颜色[%d]" i i)
  29.       )
  30.     )                                   ;
  31.   )
  32.   (if (setq e (car (xdrx_entsel "\n选取3DSOLID<退出>:" '((0 . "3DSOLID")))
  33.               )
  34.       )
  35.     (progn (xdrx_begin) (_traversface e) (xdrx_end))
  36.   )
  37.   (princ)
  38. )


搜狗截图20180528143327.png

评分

参与人数 1D豆 +5 收起 理由
sh_h + 5 好主题奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 769个

财富等级: 财运亨通

发表于 2018-5-29 10:05:42 | 显示全部楼层
本帖最后由 sh_h 于 2018-5-29 10:07 编辑

谢谢东哥分享!
其实CAD是有命令的,如果不对,还请指教!

点评

谢谢指正, CAD的命令在编程自动化处理的时候,比较难用。  详情 回复 发表于 2018-5-29 10:21

评分

参与人数 1D豆 +10 收起 理由
XDSoft + 10 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2018-5-29 10:21:23 | 显示全部楼层
sh_h 发表于 2018-5-29 10:05
谢谢东哥分享!
其实CAD是有命令的,如果不对,还请指教!

谢谢指正,
CAD的命令在编程自动化处理的时候,比较难用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-8-26 13:40:33 来自手机 | 显示全部楼层
东哥厉害,原来acbr库是这么用的
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-8-26 15:19:11 来自手机 | 显示全部楼层
我想用acbr库将面域转换成多段线而不是用打破的方法,使用acbredge和acbrloop怎么总是不允许不完整的类型
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2020-1-2 13:58:05 | 显示全部楼层
怎样取得每个面的颜色属性?

点评

用上面的代码,循环 其中: (xdrx_setpropertyvalue e "subentcolor" (list (setq SubEntId (nth i ids)) (setq i (1+ i))) ) 是设置颜色的 用函数 xdrx_getpropertyvalue可  详情 回复 发表于 2020-1-8 17:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2020-1-2 13:59:34 | 显示全部楼层
怎样取得每个面的颜色属性?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2020-1-6 08:23:51 | 显示全部楼层
大佬有没有空帮忙解答一下.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2020-1-8 17:19:10 | 显示全部楼层
kaibing 发表于 2020-1-2 13:58
怎样取得每个面的颜色属性?

用上面的代码,循环
其中:
(xdrx_setpropertyvalue
        e
        "subentcolor"
        (list (setq SubEntId (nth i ids)) (setq i (1+ i)))
      )
是设置颜色的
用函数 xdrx_getpropertyvalue可以获取子实体的颜色
(xdrx_getpropertyvalue e "subentcolor")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2020-1-9 19:08:09 | 显示全部楼层
XDSoft 发表于 2020-1-8 17:19
用上面的代码,循环
其中:
(xdrx_setpropertyvalue

我试过了不行,所以才有以上问题的。请帮忙试一下,这个对我作用很大。谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2020-2-8 21:24:35 | 显示全部楼层
老大们,是我用的不对吗,请帮忙指正,为什么查不到
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2020-2-8 21:26:15 | 显示全部楼层
老大们,是我用的不对吗,请帮忙指正,为什么查不到
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2020-3-31 13:58:22 | 显示全部楼层
怎麼設置我選擇的幾個面的顏色?怎麼建立立體面的選擇集?怎麼樣高亮指定面?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2020-4-2 13:49:19 | 显示全部楼层
kaibing 发表于 2020-3-31 13:58
怎麼設置我選擇的幾個面的顏色?怎麼建立立體面的選擇集?怎麼樣高亮指定面?

老大們,幫忙看看我的問題
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2020-4-2 15:19:20 | 显示全部楼层
本帖最后由 Lisphk 于 2020-4-2 15:22 编辑
kaibing 发表于 2020-1-2 13:58
怎样取得每个面的颜色属性?

获取每个面的颜色

  1. (defun c:tt ()
  2.   (defun _traversface (e)
  3.     (setq br (xdbr::constructor e))
  4.     (setq tr (xdbr::constructor "brepfacetraverser" br))
  5.     ;;FACE遍历
  6.     (setq ids nil)
  7.     (while (not (xdbr::traverser:done tr));遍历面
  8.       (if (setq face (xdbr::getpropertyvalue tr "face"));获得当前遍历指针位置的面AcBrFace
  9.         (progn (setq SubEntPath (xdbr::getpropertyvalue face "subentpath");获得面的子实体路径
  10.                      SubEntId   (xdrx_getpropertyvalue SubEntPath "subentid");;获得子实体ID
  11.                      ids        (cons SubEntId ids);保存到全局表
  12.                )
  13.                (xdrx_object_release SubEntPath);;释放子实体路径变量
  14.         )
  15.       )
  16.       (xdbr::traverser:next tr);;遍历器指向下个位置
  17.     )
  18.     (xdrx_object_release tr br);;释放遍历器和BREP变量
  19.     (setq i 0)
  20.     (repeat (length ids);获取子实体面颜色
  21.       (setq clr (xdrx_getpropertyvalue
  22.                   e
  23.                   "subentcolor"
  24.                   (list (setq SubEntId (nth i ids)) (setq i (1+ i)))
  25.                 )
  26.       )
  27.       (xdrx_object_release SubEntId);;释放子实体ID变量
  28.       (xdrx_prompt
  29.         (xdrx_string_format "\n - 面[%d]-颜色[%d]" i clr)
  30.       )
  31.     )                                   ;
  32.   )
  33.   (if (setq e (car (xdrx_entsel "\n选取3DSOLID<退出>:" '((0 . "3DSOLID")))
  34.               )
  35.       )
  36.     (progn (xdrx_begin) (_traversface e) (xdrx_end))
  37.   )
  38.   (princ)
  39. )



搜狗截图20200402152039.jpg
命令: tt

选取3DSOLID<退出>:
- 面[1]-颜色[224]
- 面[2]-颜色[230]
- 面[3]-颜色[105]
- 面[4]-颜色[136]
- 面[5]-颜色[218]
- 面[6]-颜色[107]


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-23 22:17 , Processed in 0.498649 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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