明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: baitang36

[经验] 【原创】用纯lisp实现打印任意尺寸pdf

    [复制链接]
发表于 2024-2-21 20:16:50 | 显示全部楼层
CAD2024貌似不支持ADOBE PDF打印任意尺寸的PDF了, 自定义尺寸不行. 自定尺寸以后, 还是A4的, 具体如下图所示,   哪位用2024的大神帮忙测试一下看看?

本帖子中包含更多资源

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

x
发表于 2024-2-22 11:32:53 | 显示全部楼层
太厉害了。不知道大侠可以不可以告诉我们lisp读写.pmp和.pc3文件的方法呢?
发表于 2024-2-23 09:01:59 | 显示全部楼层
以前一直没找到自定义打印纸张任意尺寸的方法,就用了个最笨的方法,在一台电脑上设置了大量能用得着的自定义纸张,然后把DWG To PDF.pmp、DWG To PDF.pc3拷贝到其他电脑上,再用程序寻找大小最接近的纸张来实现自动出图
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-2-24 06:47:01 | 显示全部楼层
本帖最后由 baitang36 于 2024-2-24 07:11 编辑
zhang007 发表于 2024-2-23 09:01
以前一直没找到自定义打印纸张任意尺寸的方法,就用了个最笨的方法,在一台电脑上设置了大量能用得着的自定 ...

我用的是根据图的大小去修改这两个文件。你的办法是准备很多双鞋,我的是根据脚的大小去做鞋,一双就够了。
发表于 2024-2-27 07:28:31 | 显示全部楼层
感谢作者研究。昨天折腾了一天,也实现了自定义任意纸张尺寸。办法是直接用作者的函数生成pc3和pmp文件,读成表,修改尺寸参数,再写入pc3和pmp文件,直接就可以用了。刚开始还研究怎么解包打包,后来发现把文件格式直接改Unix格式就行,又研究怎么改格式,找一圈都没发现lisp有这方面资料,死马当活马,直接读文件为表,再写表,就是Unix文件了,直接就能用了。感谢作者分享技术,感谢各位大神研究

点评

列害,厉害  发表于 2024-3-26 20:19
很给力!  发表于 2024-2-27 09:37
发表于 2024-2-27 10:45:14 | 显示全部楼层
zhang007 发表于 2024-2-23 09:01
以前一直没找到自定义打印纸张任意尺寸的方法,就用了个最笨的方法,在一台电脑上设置了大量能用得着的自定 ...

其实还有第三种思路:裁剪pdf,效果也不差。。

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-2-28 04:51:42 | 显示全部楼层
mj0000 发表于 2024-2-27 07:28
感谢作者研究。昨天折腾了一天,也实现了自定义任意纸张尺寸。办法是直接用作者的函数生成pc3和pmp文件,读 ...

能否分享一下用lsp读写unix文件?曾卡在这里很久
发表于 2024-2-28 10:05:59 | 显示全部楼层
baitang36 发表于 2024-2-28 04:51
能否分享一下用lsp读写unix文件?曾卡在这里很久

也是别人的函数,具体是谁分享的也忘记了都是拿来主义
  1. ;; 按行读文本文件到表 (快于 read-line 函数)
  2. (defun VlDos_ReadFile (Fil / FilObj FilPth FilSys OpnFil All)
  3.   (if (and (setq FilPth (findfile Fil)) (setq FilSys (vlax-create-object "Scripting.FileSystemObject")))
  4.     (progn
  5.       (setq FilObj (vlax-invoke FilSys 'GetFile FilPth)
  6.             OpnFil (vlax-invoke FilObj 'OpenAsTextStream 1 0) ;只读模式
  7.             All    (car (Cov-Str2List (vlax-invoke OpnFil 'readall) '("\r\n"))) ;字符串转表
  8.       )
  9.       (vlax-invoke OpnFil 'Close)
  10.       (vlax-release-object OpnFil)
  11.       (vlax-release-object FilObj)
  12.       (vlax-release-object FilSys)
  13.     )
  14.   )
  15.   All
  16. )
  17. ;; 将字符串或表写入文件 (快于 write-line 函数)
  18. (defun VlDos_WriteFile (Fil TXT Mode / FilObj FilPth FilSys OpnFil Line)
  19.   (if TXT
  20.     (progn
  21.       (if (and (member mode '("w" "W")) (findfile Fil))
  22.         (vl-file-delete (findfile Fil)) ;为T时删除原文件
  23.       )
  24.       (if (setq FilSys (vlax-create-object "Scripting.FileSystemObject"))
  25.         (progn
  26.           (if (null (setq FilPth (findfile Fil)))
  27.             (setq OpnFil (vlax-invoke FilSys 'CreateTextFile Fil 0 0)) ;文件编码为为ASCII格式(最后一个参数控制编码 0 = ascii编码, -1 = unicode编码, -2 system default编码)
  28.             (setq FilObj (vlax-invoke FilSys 'GetFile FilPth)
  29.                   OpnFil (vlax-invoke FilObj 'OpenAsTextStream 8 0) ;添加模式
  30.             )
  31.           )
  32.           (if OpnFil
  33.             (progn
  34.               (vlax-invoke OpnFil 'Write (strcat (Cov-All_To_EleStr TXT "\r\n") "\r\n")) ;尾部加换行,不然添加模式下会有重叠的行
  35.               (vlax-invoke OpnFil 'Close)
  36.               (vlax-release-object OpnFil)
  37.               (if (= (type FilObj) 'vla-object)
  38.                 (vlax-release-object FilObj)
  39.               )
  40.               (vlax-release-object FilSys)
  41.             )
  42.           )
  43.         )
  44.       )
  45.       (if (setq Filpth (findfile Fil))
  46.         (setq FilPth (YX:Get-VlDos_FormatPath filpth))
  47.       )
  48.     )
  49.   )
  50.   filpth
  51. )
发表于 2024-2-28 10:14:13 | 显示全部楼层
补充两个子函数
Cov-Str2List by llsheng_73 -- http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109842
  1. ;; 任意值转字符串
  2. (defun Cov-All_To_EleStr (Val Str)
  3.   (if (not Str)
  4.     (setq Str " ") ;默认分割字符
  5.   )
  6.   (cond
  7.     ((= (type Val) 'INT) (vl-princ-to-string Val))
  8.     ((= (type Val) 'REAL) (vl-princ-to-string Val))
  9.     ((= (type Val) 'list) ;有子表时,递归
  10.      (apply 'strcat
  11.             (cons
  12.               (Cov-All_To_EleStr (car Val) Str)
  13.               (mapcar
  14.                 '(lambda (l) (strcat Str (Cov-All_To_EleStr l Str)))
  15.                 (cdr Val)
  16.               )
  17.             )
  18.      )
  19.     )
  20.     ((= (type Val) 'STR) Val) ;参数是单独的一个字符串也可以,容错
  21.     (t "")
  22.   )
  23. )
 楼主| 发表于 2024-2-28 11:07:30 | 显示全部楼层
mj0000 发表于 2024-2-28 10:05
也是别人的函数,具体是谁分享的也忘记了都是拿来主义

write-line会把0A自动变成0d 0a 这样unix格式就变成一般的文本格式了,导致pc3加载时崩溃
后来我用二进制写的,用保留函数实现,这也是导致不提供源码的原因。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 07:55 , Processed in 0.163065 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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