本帖最后由 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")))
|