明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1238|回复: 13

[提问] 求助:图层透明度的算法

[复制链接]
发表于 2022-3-4 18:55:28 | 显示全部楼层 |阅读模式
本帖最后由 wharan 于 2022-3-5 20:56 编辑

做一段小程序,需要定义图层透明度。在群内1291500406和guosheyang等大侠的帮助下,总算通过 (-3 ("AcCmTransparency" (1071 . 33554623)))方法实现了透明图层的定义。但接下来又碰到了新的问题,(-3 ("AcCmTransparency" (1071 . 33554623)))中图层透明度25对应的33554623是怎么计算出来的,求大侠告知算法,不胜感激。


群内真是卧虎藏龙啊。在各位朋友的热心帮助下,算法完美解决,在此一并表示感谢。

如果一个层已经存在,怎么强制更新图层透明度呢?颜色、线型等均已解决,透明度解决不了。


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-3-5 15:58:43 | 显示全部楼层
本质应该是记录的不透明度值 透明25%,那么不透明75%。
记录值采用的是一个字节大小来存储,范围0-255,255*0.75=191.25 取整191
这个透明度是占用4个字节,高位为02,中间两个字节为0000,低位是不透明度值0xBF=191
0x020000BF=33554623
  1. (+ (lsh 2 56) (fix (* 255(- 1 (* 25 0.01) ))))

评分

参与人数 1明经币 +1 收起 理由
Bao_lai + 1 很给力!

查看全部评分

回复 支持 3 反对 0

使用道具 举报

发表于 2022-3-5 18:51:02 | 显示全部楼层
edata 发表于 2022-3-5 15:58
本质应该是记录的不透明度值 透明25%,那么不透明75%。
记录值采用的是一个字节大小来存储,范围0-255,25 ...

确实,这个Alpha通道记录的是不透明度。
回复 支持 1 反对 0

使用道具 举报

发表于 2022-6-21 13:49:47 | 显示全部楼层
  1. ;功能 : 设置图层的透明度
  2. ;参数:
  3. ;      layername : 图层名称
  4. ;      value : 设置值0~100的值
  5. ;函数:无
  6. ;示例:(yd-layer-transparency "0" 0)
  7. (defun yd-layer-transparency(layername value /
  8.                               ent Objlayer transparency data data-3
  9.                             )
  10.   (if (and
  11.         (<= 0 value 100)
  12.         (tblsearch "layer" layername)
  13.       )
  14.     (progn
  15.       (setq
  16.         ent (tblobjname "layer" layername)
  17.         Objlayer (vlax-ename->vla-object ent)
  18.         transparency (+ (lsh 2 56) (fix (* 255(- 1 (* value 0.01) ))))
  19.         data (entget (tblobjname "layer" layername) '("*"))
  20.         data-3 (cdr (assoc -3 data))
  21.       )
  22.       (if (/= (assoc "AcCmTransparency" (cdr (assoc -3 data))) nil)
  23.         (progn
  24.           (setq
  25.             data-3 (if (= value 0) (vl-remove (assoc "AcCmTransparency" data-3) data-3) (subst (list "AcCmTransparency" (cons 1071 transparency)) (assoc "AcCmTransparency" data-3) data-3))
  26.             data (subst (cons -3 data-3) (assoc -3 data) data)
  27.           )
  28.           (entmod data)
  29.         )
  30.         (progn
  31.           (setq
  32.             data-3 (if (= value 0) data-3 (cons (list "AcCmTransparency" (cons 1071 transparency)) data-3))
  33.             data (subst (cons -3 data-3) (assoc -3 data) data)
  34.           )
  35.           (entmod data)
  36.         )
  37.       )
  38.       
  39.       (vla-put-layeron Objlayer (vla-get-layeron Objlayer))
  40.       ;更新图层(vla-regen (vla-get-activedocument(vlax-get-acad-object)) 1),不知道vla-regen和redraw方法哪个速度更快
  41.       (redraw ent)
  42.     )
  43.   )
  44.   (princ)
  45. )

发表于 2022-3-4 21:03:55 | 显示全部楼层
自己遍历一下就有了
 楼主| 发表于 2022-3-4 22:26:20 | 显示全部楼层
guosheyang 发表于 2022-3-4 21:03
自己遍历一下就有了

没有思绪,不知道从何下手,从没涉及这方面的算法
发表于 2022-3-5 08:26:13 | 显示全部楼层
本帖最后由 Bao_lai 于 2022-3-5 08:27 编辑

(setq a(lsh 33554623 24))-->-1090519040   (abs(- (lsh (+ a 2147483647)25)(lsh a -24)))-->33554623


按照强哥提供的参考算法提示,穷举算了下发现可以对应0~255一共256个值,发现CAD的透明度可以用Entmake的这个方式实现(33554687~33554432)0~100%,
具体的对应关系见附件。

本帖子中包含更多资源

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

x
发表于 2022-3-5 11:21:17 | 显示全部楼层
简化下,事实上 只需要这样一个码值表1071的关联码值,依次对应透明度从0 1 2 到99 100共101个值即可
(setq tmdmzb(list 33554687 33554684 33554681 33554679 33554676 33554674 33554671 33554669 33554666 33554664 33554661 33554658 33554656 33554653 33554651 33554648 33554646 33554643 33554641 33554638 33554636 33554633 33554630 33554628 33554625 33554623 33554620 33554618 33554615 33554613 33554610 33554607 33554605 33554602 33554600 33554597 33554595 33554592 33554590 33554587 33554585 33554582 33554579 33554577 33554574 33554572 33554569 33554567 33554564 33554562 33554559 33554556 33554554 33554551 33554549 33554546 33554544 33554541 33554539 33554536 33554534 33554531 33554528 33554526 33554523 33554521 33554518 33554516 33554513 33554511 33554508 33554505 33554503 33554500 33554498 33554495 33554493 33554490 33554488 33554485 33554483 33554480 33554477 33554475 33554472 33554470 33554467 33554465 33554462 33554460 33554457 33554454 33554452 33554449 33554447 33554444 33554442 33554439 33554437 33554434 33554432))
发表于 2022-3-5 13:09:46 | 显示全部楼层
本帖最后由 Bao_lai 于 2022-3-5 15:12 编辑

换算关系
# 透明度的范围是0-255,
eg:25%不透明度也就是255*25%=63.75,四舍五入64;
  1. ;(setq 透明度 25) ;--->1071组码 33554623
  2. ;(setq 组码 (fix (+ 0.05 (- 33554687 (* 255 (float 透明度) 0.01)))))

;修正一个问题
(setq 透明度 25) ;--->1071组码 33554623
(setq 组码 (fix (- 33554687 (* 255 透明度 0.01))))

评分

参与人数 1明经币 +1 收起 理由
guosheyang + 1 赞一个!

查看全部评分

 楼主| 发表于 2022-3-5 19:48:12 | 显示全部楼层
Bao_lai 发表于 2022-3-5 13:09
换算关系
# 透明度的范围是0-255,
eg:25%不透明度也就是255*25%=63.75,四舍五入64;

感谢你的指点。还有一个问题,如果一个层已经存在,怎么强制更新图层透明度呢?
发表于 2022-3-5 21:40:18 | 显示全部楼层
wharan 发表于 2022-3-5 19:48
感谢你的指点。还有一个问题,如果一个层已经存在,怎么强制更新图层透明度呢?

(regapp "AcCmTransparency")
(Setq a (entget (tblobjname "layer" "图层名称") '("AcCmTransparency")))
(setq a (subst '(-3 ("AcCmTransparency" (1071 . 33554462))) (assoc -3 a) a))
;;利用ent的subst替换祖码,entmod更新信息。
(entmod a)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 17:25 , Processed in 0.194714 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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