kucha007 发表于 2023-3-14 22:03:53

【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")))






yefei812678 发表于 2024-2-23 11:47:54

能自动选择嘛?
页: [1]
查看完整版本: 【K:GetPaperType】计算纸张类型和加长比