Manila Wolf 发表于 2022-7-6 08:44:19

将文本附加到文件

我有一个非常有用的mass properties lisp(mp.lsp)。我已经有很多年了,我不记得我从哪里得到它。
 


;
; CALCULATION OF MASS PROPERTIES (This won't work if C: drive is locked
by your administrator)
;
(defun c:mp()
(setq fn
"c:/mass.mpr")
(princ "\n Please select a region:")
(setq ss
(ssget))
(command "massprop" ss "" "y" fn)
(setq fn1 (open fn
"r"))
(setq x (read-line fn1))
(setq n 1)
(while (/=
n 5)
(setq x (read-line fn1))
(setq y
(read-line fn1))
(setq n (+ n 1))
)
(close
fn1)
(setq x1 (read (substr x 26)))
(setq y1 (read (substr y
26)))
(setq pt1 (list x1 y1))
(command "point"
pt1)
(command "ucs" "o" pt1)
(command "massprop" ss "" "y"
fn)
(textscr)
(command "ucs" "w")
)

 
它创建了一个扩展名为的临时文本文件。可以用任何文本编辑器打开的mpr。它将文本文件放在C:drive中。
我要找的是一个lisp,它可以打开文本文件,然后在每行的末尾添加预定义的文本,然后将修改后的文本插入到图形中。
例如,这是文本文件中的典型读数。它始终具有相同的文本行数:-
 
 
----------------地区-------------
面积:2500.000
周长:200.000
边界框:X:-25.000--25.000
Y: -25.000--25.000
质心:X:0.000
Y: 0.000
惯性矩:X:520833.334
Y: 520833.334
惯性积:XY:0.000
回转半径:X:14.434
Y: 14.434
关于质心的主矩和X-Y方向:
一: 520833.333沿
J: 520833.333沿
 
 
 
这是我希望最终文本的示例,每行都添加了一个后缀:-
 
 
----------------地区-------------
面积:2500.000 mm^2
周长:200.000 mm
边界框:X:-25.000--25.000 mm
Y: -25.000-25.000毫米
质心:X:0.000 mm
Y: 0.000毫米
惯性矩:X:520833.334 mm^4
Y: 520833.334毫米
惯性积:XY:0.000 mm^2
回转半径:X:14.434 mm
Y: 14.434毫米
关于质心的主矩和X-Y方向:
一: 520833.333沿mm^4
J: 520833.333沿mm^4
 
 
我进行了搜索,可以通过手动为每一行输入一个后缀,找到在单个文本行上应用后缀的lisp例程。但如果我能把它自动化,那就更好了。
 
另一个充满希望的帖子是我在寻求帮助。

Manila Wolf 发表于 2022-7-6 09:03:28

我确实找到了一种相对快速、简单的方法,不用lisp就能做到这一点。
 
打开。在记事本中复制mpr文件,然后将文本粘贴到excel文件中,在该文件中,可以通过连接轻松地将单位附加到文本中。
 
复制生成的文本并将特殊文本粘贴回AutoCAD dwg。

BIGAL 发表于 2022-7-6 09:10:35

只需阅读lisp帮助中关于如何打开文件的内容,这非常简单
我会的
选择一个pt
打开“r”
读入一行
添加额外文本strcat
pt处的文字计算下一点1.4倍car下方文字高度,拾取pt的cadr为x和y
 
 
 
代码令人困惑,似乎做了两次相同的事情,但读取行是你想要的。

pBe 发表于 2022-7-6 09:21:48


(defun c:mp2 (/ ss ptx fn fn1 str)
(defun Text (pt hgt str sty)
   (entmakex (list (cons 0 "TEXT")
   (cons 10 pt)
   (cons 40 hgt)
   (cons 7 sty)
   (cons 1 str)
      )
   )
)
(setq txtlst nil)
(if (setq ss (ssget "_+.:E:S" '((0 . "REGION"))))
   (progn
   (command "_.UCS"
       "_Origin"
      (setq ptx (vlax-safearray->List
   (variant-value
       (vlax-get-property
         (vlax-ename->vla-object
    (cadar (ssnamex ss))
         )
         'centroid
       )
   )
   )
)
   )
   (command "point" "0,0,0")
   (command "massprop"
       ss
       ""
       "y"
       (setq fn
       "c:/mass.mpr"
       )
   )
   (terpri)
   (command "ucs" "w")
   (progn
(setq fn1 (open fn "r"))
(read-line fn1)
(while
(setq str (read-line fn1))
   (setq txtlst (cons str txtlst))
)
(close fn1)
   )
   (textscr)
   (setq Txtpt (list (car ptx)
(- (cadr ptx) (* (getvar 'Textsize) 1.70) )
(last ptx)
   )
   )
   (mapcar (function (lambda (lst1 lst2)
    (Text (trans (setq Txtpt
          (list
   (car Txtpt)
   (- (cadr Txtpt)
      (* (getvar 'Textsize)
         1.70
      )
   )
   (last Txtpt)
          )
   ) 1 0)
   (getvar 'Textsize)
   (strcat lst1 lst2)(getvar 'Textstyle)
    )
)
      )
      (reverse txtlst)
      '(""""   " mm^2"" mm"    " mm"    " mm"
" mm"" mm"   " mm^4"" mm^4"" mm^2"" mm"
" mm"""   " mm^4"" mm^4"
       )
   )
   )
)
(princ)
)

Manila Wolf 发表于 2022-7-6 09:37:16

太棒了。工作是一种享受。非常感谢你。
再一次,你帮了我很大的忙。
 
这段代码我会经常使用,即使像我这样一个没有lisp的人也可以很容易地修改代码以适应厘米单位和英制单位。
 
比格尔,谢谢你的评论。我认为这促使pBe陷入困境。
 
我真的相信世界各地的许多人都会进行搜索,找到并使用这段极其有用的代码。
 
我自己的代码:-
 
Cadtutor (pBe, Lee Mac, et al) = Fantastic Forum

pBe 发表于 2022-7-6 09:48:43

 
欢迎马尼拉·沃尔夫,这都是比格尔的想法,真的,它本来可以写得完全不同,但我真的不想重写整个代码,作为对原作者的尊重,但它仍然适合你。
 
干杯
 
页: [1]
查看完整版本: 将文本附加到文件