Константин пишет:

Есть чертеж с кучей 3D-полилиний, и для него требуется сделать подпись высотной отметки около каждой вершины.



Поиск по форуме не помог (есть одна программа на форуме, но она только для Civil).

как вариант можно проставить точку в каждой вершине, а другим лиспом подписать точки.



Может у кого завалялась програмка или сможет выручить лиспом?!

(vl-load-com)
(defun c:zlabel (/ ss i en ed vn vd vl txt z)
  (while (not ss)
         (setq ss (ssget (list (cons 0 "POLYLINE")
                               (cons -4 "=")
                                 (cons 70 8)))))
  (setq i 0)
  (while (setq en (ssname ss i))
         (setq ed (entget en)
               vn (entnext en)
               vd (entget vn))
         (while (= "VERTEX" (cdr (assoc 0 vd)))
                (setq vl (cons (cdr (assoc 10 vd)) vl))
                (setq vn (entnext vn)
                      vd (entget vn)))
         (setq i (1+ i)))

  (setq txt 0.075)

  (foreach v vl
    (setq z (caddr v))

    (entmake (list (cons 0 "INSERT")
                   (cons 2 "LEV-50A")
                   (cons 8 "Вершины 3d полилинии")
                   (cons 10 v)
                   (list 210 0 0 1)))

    (entmake (list (cons 0 "TEXT")
                   (cons 1 (rtos z 2 3))
                   (cons 6 "BYLAYER")
                   (cons 7 (getvar "TEXTSTYLE"))
                   (cons 8 "Вершины 3d полилинии")
                   (cons 10 (polar v (* pi 0.5) (* txt 2)))
                   (cons 11 (polar v (* pi 0.5) (* txt 2)))
                   (cons 39 0)
                   (cons 40 txt)
                   (cons 41 1)
                   (cons 50 0)
                   (cons 51 0)
                   (cons 62 256)
                   (cons 71 0)
                   (cons 72 4)
                   (cons 73 0)
                   (list 210 0 0 1))))
  (prin1))

2

(7 ответов, оставленных в Довески)

menu GEO

3

(1 ответов, оставленных в LISP)

Для вставки блока использую такой макрос ^C^C_-insert;(имя блока);\;;;\
Подскажите, как дополнить данный макрос, чтобы при вставке в чертеж блока создавался слой с заданным именем, и этот блок помещался в данный слой. Буду признателен если подскажите.

4

(8 ответов, оставленных в Печать)

;;; CADALYST 08/05    Tip 2053: SaveDoc.lsp    Text into a MS Word File (c) Andrzej Gumula


;;; This routine exports selected text to Word document
;;; Microsoft Office must be installed in Windows
;;; *********************************************************
;;; Andrzej Gumula
;;; ul. Modrzewiowa 19/54
;;; 40-171 Katowice POLAND
;;; email: a.gumula@wp.pl

(defun c:Save2Doc (/ TxtSet Word Docs NewDoc Paragraphs Range
                    OldTxtList NewTxt IdTxtList FontName Txt Count
            Flag#1 Flag#2)

(defun Dxf (Index)
 (cdr (assoc Index (entget (ssname TxtSet Count))))
);end Dxf

(defun ClearMTFormat (Str / Item TLength Char New);;; clear mtext format in string
  (setq Item 1 TLength (strlen Str) New "")
  (while (<= Item TLength)
   (setq Char (substr Str Item 1))
   (if    (= Char "\\")                
     (progn
      (setq Item (1+ Item))        
      (setq Char (substr Str Item 1))
      (cond
       ((member Char '("\\" "f" "F" "C" "H" "S" "T" "Q" "W"))
        (while (and (/= Char ";") (<= Item TLength))
         (setq Item (1+ Item))
         (setq Char (substr Str Item 1))
        );end while
       )
       ((= Char "P")
        (setq New (strcat New "\n"))
       )
       ((member Char '("{" "}"))
    (setq New (strcat New Char))
       )
      );end cond
     );end progn
     (if (not (member Char '("{" "}")))
      (setq New (strcat New Char))            
     );end if
    );end if
    (setq Item (1+ Item))
   );end while
   (cond (New) (T ""))
);end ClearMTFormat

(defun GetOpenDocs (Docs / Item Names);;; list of open Word documents
  (repeat (setq Item (vla-get-count Docs))
   (setq Names (cons (strcase (findfile (vla-get-fullname (vla-item Docs Item)))) Names)) 
   (setq Item (1- Item))
  );end repeat
  Names
);end GetOpenDocs
  
(princ "\nSelect TEXT (MTEXT) to export to Word document: ")
(cond 
 ((setq TxtSet (ssget '((0 . "*TEXT"))))
  (cond
  ((setq File (getfiled "Select Word document" (strcat (vl-filename-base (getvar "dwgname")) ".doc") "doc" 1))
   (vl-load-com)
   (prompt "\nExport text to Word. Please wait...")
   (princ)
   (if (not (setq Word (vlax-get-object "Word.Application")));;;is already open ?
    (setq Word (vlax-get-or-create-object "Word.Application"));;; no open
    (setq Flag#1 T)
   );end if
   (cond
    (Word
    (if (not Flag#1) (vla-put-visible Word :vlax-false));;; hide window application
    (if (findfile File)
     (setq Flag#2 (member (strcase (findfile File)) (GetOpenDocs (vlax-get-property Word 'Documents)))
       NewDoc (vlax-invoke-method (vlax-get-property Word 'Documents) 'Open File))
     (setq  NewDoc (vlax-invoke-method (vla-get-documents Word) 'add))
    );end if
    (setq Paragraphs (vlax-get-property NewDoc 'Paragraphs) Count 0)  
    (repeat (sslength TxtSet)
     (setq String (vla-get-TextString (vlax-ename->vla-object (ssname TxtSet Count))))
     (setq Range (vlax-get-property (vlax-get-property Paragraphs 'last) 'Range))
     (if (not (setq FontName (cdar (cdadr (assoc -3 (entget (tblobjname "STYLE" (Dxf 7)) '("ACAD")))))))
      (setq FontName (vl-filename-base (cdr (assoc 3 (tblsearch "STYLE" (Dxf 7))))))
     );end if
     (vlax-put-property (vlax-get-property Range 'Font) 'Name FontName)
     (if (= (Dxf 0) "MTEXT") (setq String (ClearMTFormat String)))
     (vlax-invoke-method Range 'InsertAfter (strcat String "\n"))
     (setq Count (1+ Count))
    );end repeat
    (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-saveas (list NewDoc File)))
      (prompt "\nProbably selected file is read-only. Cannot export text to this file. ")
      (vla-saveas NewDoc File);;; save document
    );end if
    (cond
     ((not Flag#1)
      (vla-quit Word 0)
     )
     (T (if (not Flag#2) (vla-close NewDoc));;; close application
        (vla-put-visible Word :vlax-true);;; show application
     )
    );end cond
    (mapcar 'vlax-release-object (list Word NewDoc Paragraphs Range));;; objects release
    (mapcar '(lambda (x) (set x nil)) '(Word NewDoc Paragraphs Range));;; null all variables
    )
   (T (prompt "\nCan't create Word document. Microsoft Ofice must be installed. "))
  );end cond Word
  )
  (T (prompt "\nFile no selected. "))
 );end cond
 )
 (T (prompt "\nNothing selected. "));;; text no selected
);end cond
 (princ)
);end c:Save2Doc

(defun c:SD ()
  (c:Save2Doc)
);end c:SD

(prompt "\nLoaded new command Save2Doc [SD]. ")
(prompt "\n[c]2004 Andrzej Gumula. ")
(princ)

;************** in the future - maybe in next version ?
;(vlax-invoke-method Range 'InsertSymbol 176 nil)   ;degree%%d
;(vlax-invoke-method Range 'InsertSymbol 177 nil t) ;plus-minus%%p
;(vlax-invoke-method Range 'InsertSymbol 216 nil t) ;diameter%%c

 

5

(4 ответов, оставленных в LISP)

geo_rva пишет:

Нельзя ли создать аналогичный лисп, который бы проставлял случайные фактические размеры с поправкой в указанном диапазоне  в знаменатель оригинального размера , не создавая дубликат размера?

Сам, к сожалению, программировать на LISP не умею.

http://geodesist.ru/forum/threads/ПОДГО … ocad.4614/

6

(3 ответов, оставленных в LISP)

Подскажите пожалуйста. Какой прописать макрос (чтоб повесить на кнопку) AutoCAD 2008 rus, для вставки имеющегося готового блока в чертеж?

7

(4 ответов, оставленных в LISP)

Вопрос снят, проблема решилась добавлением в код функции VK_RANDNUM:

(defun vk_RandNum (/ modulus multiplier increment random)
(if (not *seed*)
(setq *seed* (getvar "DATE"))
)
(setq modulus 65536
multiplier 25173
increment 13849
*seed* (rem (+ (* multiplier *seed*) increment) modulus)
random (/ *seed* modulus)
)
)

8

(4 ответов, оставленных в LISP)

Есть лисп DIMRR. Его задача проставить по выбранным размерам размер в знаменатель с поправкой в указанном диапазоне. При его запуске предлагается выбрать диапазон, далее предлагает выбрать размер, жму интер в ком строке "no function definition: VK_RANDNUM". В чем может быть проблема? AutoCAD 2008 rus. Спасибо.
код:

(defun c:DIMRR (/ *actdoc* selset item temp_text i To From +Sign Diff Num)
  (vl-load-com)
  (setq *actdoc* (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark *actdoc*)
(initget 5)
(setq To (getreal "Max величина разброса значений: "))
(setq From (- 0 To))
(setq +Sign (if (< From 0)
"+"
""
)
)
(setq Diff (- To From))
  (setq selset (ssget "_:L" '((0 . "DIMENSION"))) i '-1)
  (while (and selset
         (setq item (ssname selset (setq i (1+ i))))
         ) ;_ end of and
    (if   (and (member '(100 . "AcDbAlignedDimension") (entget item))
     (setq item (vlax-ename->vla-object item))
     (member (vla-get-textoverride item) '("" "<>"))
        )   
      (progn
   (setq dmob (vla-copy item))
   (vlax-put-property dmob "textcolor" 1)
   (setq dimtext
   (rtos (vla-get-measurement dmob)
      (vla-get-UnitsFormat dmob) (vla-get-PrimaryUnitsPrecision dmob)))
   (setq dimtext (atof dimtext))
        (setq Num (- To (* Diff (vk_RandNum))))
   (setq dimtext (+ dimtext Num))
   (setq dimtext (rtos dimtext
      (vla-get-UnitsFormat dmob) (vla-get-PrimaryUnitsPrecision dmob)))
   (if (/= (vla-get-DecimalSeparator dmob) ".")
     (setq dimtext
       (vl-string-subst (vla-get-DecimalSeparator dmob) "."  dimtext)
      )
     )
   (vla-put-TextOverride dmob (strcat "\\X" dimtext))
   (entmod
     (subst (cons 8 "Фактический размер")
       (assoc 8 (setq item (entget(vlax-vla-object->ename dmob))))
       item)
     )
   ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of while
  (vla-endundomark *actdoc*)
  (princ)
  ) ;_ end of defun