【K:GetPaperType】计算纸张类型和加长比
本帖最后由 kucha007 于 2023-3-16 01:23 编辑算是优化这个帖子的算法:http://bbs.mjtd.com/thread-186349-1-1.html
计算纸张类型和加长比(以1/4为基数,1/8为四舍五入范围)
实际的感觉大概是这样:
加载后使用:
(K:GetPaperType 210.0 335.0)
结果输出:
A4+1/4
;计算纸张类型和加长比
(defun K:GetPaperType (Num1 Num2 / Lenght Width PaperType PaperExt Round FVar)
(setq Lenght (max Num1 Num2));矩形长度
(setq Width (min Num1 Num2));矩形宽度
(setq PaperType
(/
(log (/ 1000000.0 (sqrt 2.0) (expt Width 2)))
(log 2.0)
)
);A几的纸张
(setq PaperExt (- Lenght (* (sqrt 2.0) Width) ));加长部分的长度
(setq Round (/ (* (sqrt 2) Width) 4.0));设置舍入容差
(Setq FVar (/ (fix (/ (+ PaperExt (* Round 0.5)) Round)) 4.0) );四舍五入加长部分的占比
(strcat "A" (rtos PaperType 2 0) "+" (rtos FVar 5 4))
)
应用实例:
假设我们获取了打印机自定义纸张的列表如下:
(setq CustomPaperLst
'(
"UserDefinedMetric (210.00 x 297.00毫米)"
"UserDefinedMetric (297.00 x 420.00毫米)"
"UserDefinedMetric (420.00 x 594.00毫米)"
"UserDefinedMetric (594.00 x 841.00毫米)"
"UserDefinedMetric (841.00 x 1189.00毫米)"
"UserDefinedMetric (80.00 x 80.00毫米)"
)
)
配合这个函数:
;从字符串中逐个提取数字成表
(defun K:Str2NumLst (str)
(read
(vl-list->string
(append
'(40) ;"("
(mapcar
'(lambda (xx) (if (or (= 46 xx) (<= 48 xx 57)) xx 32))
(vl-string->list str)
)
'(41) ;")"
)
)
)
)
然后这样使用,我们就可以得到打印机纸张对应的纸张类型:
(mapcar
'(lambda (XX)
(K:GetPaperType (car (K:Str2NumLst XX)) (cadr (K:Str2NumLst XX)))
)
CustomPaperLst
)
这是最终输出的结果:
("A4+0" "A3+0" "A2+0" "A1+0" "A0+0" "A7+0")
利用这个列表,也许我们可以和批量打印结合在一起,自动推荐纸张大小:
(vl-position (strcase "A4+0" ) (mapcar 'strcase '("A4+0" "A3+0" "A2+0" "A1+0" "A0+0" "A7+0")))
能自动选择嘛?
页:
[1]