Ошибка неверный тип аргумента 2d 3d точка nil

17 минут назад, kpblc сказал:

Ой, не душни

и не думал даже

просто при желании все решаемо, не так легко и приятно как в оригинале, но мы жэж привычные анально импортозамещательно все тут в нано делать

Спойлер

image.thumb.png.8c7f9ac77f42a48029b1f0e788ed12db.png

меняй не хочу, и пути окружения тут жэж рядом… реверсинжиниринг называется, потому как в справке по API  тож сахАра

17 минут назад, kpblc сказал:

Ну и запретить, ессно, пользователям пытаться поменять эти настройки

а вот тут фигушки, это в hkcu, там юзер хозяин, хотя 

вот решение что б юзер не отключил 

———————-

все это к тому, что тут это не там… нана делает в принципе все так жэж как оригинал, только API сахаркА разработчикам некогда подсыпать, поэтому не

гетсет сисвариабле, а ручками в реестре … читаем пишем и т.д.

у тебя жэж когда то был жигуль? ну вот тут  примерно то же самое…90е

добавлено через 6 минут

я к тому это все написал, что реализацию нужного функционала от разработчиков можно ждать годами без особого результата…

а работать надо уже еще вчера

поэтому включать фантазию креатив и из глины и палок лепить  рабочее решение здесь и сейчас..


Изменено 17 апреля пользователем doctorraz

Hi everyone,

The attached LISP routine which we use once every time when I export text to .xls form Autocad.

Running it causes the following error message: Bad argument type: 2D/3D point: (nil nil 0.0)>

Can someone point me to which line is causing the error, and what the solution is?

;---------------------------------------------------------------------------------------------------------------------------------
;-------------------------------------- GATHERING TABLE INFORMATION ------------------------------------
;---------------------------------------------------------------------------------------------------------------------------------
(defun tableinfo ( ss  / n entlist)
 (setq n 0)
 (repeat (sslength ss)
   (setq entlist (entget (ssname ss n)))
   (cond ((member (cdr (assoc 0 entlist)) '("LINE" "POLYLINE"))
             (getlinepts entlist)(setq linelist (cons (ssname ss n) linelist)))
            ((member (cdr (assoc 0 entlist)) '("TEXT" "MTEXT"))
             (setq textlist (cons (ssname ss n) textlist)))
            ((member (cdr (assoc 0 entlist)) '("INSERT"))
             (setq blocklist (cons (ssname ss n) blocklist)))
   )
   (setq n (1+ n))
 )
)
;-------------------------- Cell Count/Height/Width Determination ----------------------
;;Gathers x and y positions of lines and polylines in separate lists
;;This is used to determine height/width & # of rows/columns
;;Line info must be gathered first in order to determine
;;cell position of any other gathered information
;---------------------------------------------------------------------------------------
(defun getlinepts (alist / x  xpt ypt)
  (foreach x alist
     (if (member (car x) '(10 11))
         (progn
           (if (not (vl-position (setq xpt (atof (rtos (car (trans (cdr x) 0 1)) 2 2))) lpxlist))
               (setq lpxlist (cons xpt lpxlist)))
           (if (not (vl-position (setq ypt (atof (rtos (cadr (trans (cdr x) 0 1)) 2 2))) lpylist))
               (setq lpylist (cons ypt lpylist)))
         )        
      )
   )
);defun
;---------------------------- Text Info and Cell Position -----------------------------------------------------
;;Determine cell position by insertionpoint of text objects
;;(Using text center is probably more reliable)
;;Create list of indexed lists containing "Order", "Position", "Content", "Height", "Rotation", "StyleName" and "TrueColor"
;;to be used to fill acad table after creation
;;If row and column is already in list, replace with combined string
;--------------------------------------------------------------------------------------------------------------
(defun gettxtinfo (alist / x vlaobj pos rpos cpos expos)
(setq vlaobj (vlax-ename->vla-object txt)
        pos (trans (midp vlaobj) 0 1);Midpoint
        rpos (1- (vl-position (cadr pos)(vl-sort (cons (cadr pos) lpylist) '>)));Row Position
        cpos (1- (vl-position (car pos) (vl-sort (cons (car pos) lpxlist) '<))));Column Position
(if (setq expos (vl-position (list rpos cpos) (mapcar '(lambda (x)(cdr (assoc "Position" x))) tinfo)));if cell is taken
   (setq tinfo
     (replace tinfo expos
      (replace
       (nth expos tinfo)
        2
        (cons "Content"
       (if (> (cadr pos) (cdr (assoc "Order" (nth expos tinfo))));in order according to y position
          (strcat (vla-fieldcode vlaobj) " " (cdr (assoc "Content" (nth expos tinfo))))
          (strcat (cdr (assoc "Content" (nth expos tinfo))) " " (vla-fieldcode vlaobj))
       )))))
(setq tinfo
 (cons
  (list
   (Cons "Order" (cadr pos))
   (Cons "Position" (list rpos cpos));Position
   (Cons "Content" (vla-fieldcode vlaobj));Content
   (Cons "Height" (vla-get-height vlaobj))
   (Cons "Rotation" (vla-get-rotation vlaobj))
   (Cons "StyleName" (vla-get-StyleName vlaobj))
   (Cons "TrueColor"
    (if
     (= (vla-get-colorindex (vla-get-truecolor vlaobj)) 256)
      (vla-get-truecolor
       (vla-item
        (vla-get-layers ActDoc)
        (vla-get-layer vlaobj)))
      (vla-get-truecolor vlaobj)
    )
  )
 )
tinfo)))
;(vla-delete vlaobj)
);defun
;--------------------------- Block Info and Cell Position -------------------------------------------------------
;;Gather block information
;;determine cell position according to insertion point
;;Create an indexed list of lists containing "Position" (row, column), "ObjID",
;;"Attributes" (attribute id, attributetextstring) and "Scale" 
;----------------------------------------------------------------------------------------------------------------
(defun getblockinfo (obj / pos rpos cpos bname objid bobj attid)
  (if (= (type obj) 'ename)
    (setq obj (vlax-ename->vla-object obj))
  )
(setq pos (trans (midp obj) 0 1)
        rpos (1- (vl-position (cadr pos)(vl-sort (cons (cadr pos) lpylist) '>)));Row Position
        cpos (1- (vl-position (car pos) (vl-sort (cons (car pos) lpxlist) '<)));Column Position
        bname (vla-get-name obj);Block Name
        bobj (vla-item (vla-get-blocks ActDoc) bname));Block Vla Object
(vlax-for i bobj ; Foreach item in block
(if (eq (vla-get-objectname i) "AcDbAttributeDefinition");If item is an attribute
  (setq attid (append attid (list (vla-get-objectid i))));List Attribute Id
)
)
(setq objid (vla-get-objectid bobj));Block Object Id
 (setq binfo
   (cons
    (list
     (Cons "Name" bname)
     (Cons "Position" (list rpos cpos))
     (Cons "ObjID" objid)
  (if (= (vla-get-hasattributes obj) :vlax-true)
   (Cons "Attributes"
    (reverse
    (mapcar
      '(lambda (x y) (cons y (vla-get-textstring x)))
      (vlax-safearray->list (variant-value (vla-getattributes obj)))
      attid
    )
    )
   )
  )
     (Cons "Scale" (vla-get-xscalefactor obj))
    )
binfo))
)
;------------------------------------------------------------------------------------------------------------------------
;-------------------------------------------- REPLACE by Charles Alan Butler---------------------------------------------
;;Cab's replace function used in this routine to avoid overwriting cells and to update cell merge lists
;------------------------------------------------------------------------------------------------------------------------
(defun replace (lst i itm)
  (setq i (1+ i))
  (mapcar
    '(lambda (x)
      (if (zerop (setq i (1- i))) itm x)
    )
    lst
  )
)

;-------------------------Midpoint-----------------
(defun midp (obj / ObjLl ObjUr)
 (vla-GetBoundingBox obj 'ObjLl 'ObjUr)
 (mapcar
  '(lambda (a b) (/ (+ a b) 2.0))
   (safearray-value ObjLl)
   (safearray-value ObjUr))
)

;-------------------------Q&D Number Accumulation---------------------------
;Used in this routine for polar distances to determine which cells to merge.
;;Recursive function possible. Ask Gile (recursion master) if desired.
(defun acnumlist (nlist / acnlist)
 (repeat (length nlist)
  (setq acnlist (cons (apply '+ nlist) acnlist)
        nlist (reverse (cdr (reverse nlist))))
 )
 acnlist
)
;--------------------------------------------------------------------------
;; ø Remove_nth ø  (Lee Mac)          ;;
;; ~ Removes the nth item in a list.  ;;

(defun Remove_nth (i lst / j)
  (setq j -1)
  (vl-remove-if
    (function
      (lambda (x)
        (eq i (setq j (1+ j))))) lst))


 ;;; private function (fixo)
(defun setcelltext(cells row column value)
  (vl-catch-all-apply
    'vlax-put-property
    (list cells 'Item row column
	 (vlax-make-variant
	   (vl-princ-to-string value) 8)))
  )

  (defun setgridlines(xlapp range);(fixo)
  ;; select the range:
  (vlax-invoke-method range 'Select)
  ;; get excel application selection property:  
  (setq range (vlax-get-property xlapp 'Selection))
  ;; get selection borders
  (setq borders (vlax-get-property range 'Borders))
  ;; iterate through all edges of the selection
  (setq cnt 0)
    (vlax-for a	 borders
      (setq cnt (1+ cnt))
      (vl-catch-all-apply
	(function
	  (lambda ()
	    (progn
	      (if (< cnt 5)
		(progn
		  (vlax-put-property
		    a
		    'LineStyle
		    (vlax-make-variant 1 3)); single line style
		  (vlax-put-property
		    a
		    'Weight
		    (vlax-make-variant 2 3));  lines
		  (vlax-put-property
		    a
		    'ColorIndex
		    (vlax-make-variant 1 5))); color black
		
		;; turn off the diagonal lines:
		(vlax-put-property a 'LineStyle (vlax-make-variant -4142 3))
		)
	      )
	    )
	  )
	)
      )
  (princ)
  )

(defun conexcelcolumn (/ a b list1);(Q. J. Chen)
  (setq a 65)
  (setq list1 nil)
  (repeat 26
    (setq list1 (append
		  list1
		  (list (chr a))
		)
    )
    (setq a (1+ a))
  )
  (setq a 65)
  (repeat 26
    (setq b 65)
    (repeat 26
      (setq list1 (append
		    list1
		    (list (strcat (chr a) (chr b)))
		  )
      )
      (setq b (1+ b))
    )
    (setq a (1+ a))
  )

  list1
)

  
 ;;; private function
 ;;;  apply props
(defun Orient (xlrange)
  (mapcar '(lambda (prop value)
	     (vl-catch-all-apply
	       'vlax-put-property
	       (list xlrange
		     prop
		     value
	       )
	     )
	   )

	  (list	'HorizontalAlignment 'VerticalAlignment 'Orientation)

	  (list -4143 -4108 (cvunit (cdr (assoc "Rotation" x)) "radian" "degree"))
  )

)

;---------------------------------------------------------------------------------------------------------------------
;------------------------------------------- CONVERT OLD TABLE ROUTINE -----------------------------------------------
;---------------------------------------------------------------------------------------------------------------------
(defun c:TE (/ ActDoc   *error* orerror otcontents textlist    colwidths i mlist  p0 hmergelist2 vmergelist2
                       *Space*  lpxlist lpylist  tinfo     cwidths     check        tstyle     spos newstring
                       tstylelst blocklist  rowheights selsets       tstylelst2 tstylelst3
                       kword     linelist       binfo        rheights   hmergelist vmergelist  ssitem   tblobj mb   
                       colorlst colorlst2 th tr ts tc newstyle RowTypes a acapp acsp address adoc atable borders cnt col data_list fname font prop release row
	       selrange sset txt_list urange value xlapp xlbook xlbooks xlcells xlrange xlsheet xlsheets)
                
(vl-load-com)
(setq oerror *error*)
(defun *error* ( msg )
        (princ (strcat "n<" msg ">n"))
	(mapcar '(lambda (x)(and x (not (vlax-object-released-p x))(vlax-release-object x))) (list ssitem)) 
        (setq *error* oerror)
        (setvar 'nomutt 0)
	(vla-EndUndoMark ActDoc)
        (princ)
);defun *error*
(setq ActDoc (vla-get-activedocument (vlax-get-acad-object))
        *Space* (vlax-get-property ActDoc (nth (vla-get-ActiveSpace ActDoc)'("PaperSpace" "ModelSpace"))))

(vla-EndUndoMark ActDoc)
(vla-StartUndoMark ActDoc)

(setq otcontents (ssget))
(command "._zoom" "object" otcontents "")
(princ "nSorting Line Info...")
(tableinfo otcontents)
(setq lpxlist (vl-sort lpxlist '<) lpylist (vl-sort lpylist '>)) 
(princ "nSorting Text Info...")                                   
(mapcar '(lambda (txt)(gettxtinfo (entget txt))(redraw txt 2)) textlist);;using redraw function To avoid interference 
(princ "nSorting Block Info...")             
(mapcar '(lambda (blk)(getblockinfo blk)) blocklist)   
(setq colwidths (mapcar '(lambda (x)(- (nth (1+ (vl-position x lpxlist)) lpxlist) x))(reverse (cdr (reverse lpxlist))))
      rowheights (mapcar '(lambda (x)(- x (nth (1+ (vl-position x lpylist)) lpylist)))(reverse(cdr (reverse lpylist)))))
(setq p0 (vlax-3d-point (trans (list (car lpxlist) (car lpylist) 0.0) 1 0)));;<---Table Placement (Currently using Top Left corner)
(progn
(princ "nSearching for merged cells...") 
(princ)
(setvar 'nomutt 1)
;-----------------------------------Method to determine which cells to merge--------------------------------------------
;Method fails if missed selection is not possible at zoom level.
;To determine which cells to merge, a selection at point is used.
;For each row, a selection is attempted at each vertical line at row's center.
;If no selection is made, the point is at the center or left of horizontally merged cells.
;For each column, a selection is attempted at each horizontal line at column's center.
;If no selection is made, the point is at the center or upper region of vertically merged cells.
;Continuation of merging is determined by a 'consecutive miss'.
;When a 'consecutive miss' is made, max column/row item is replaced by the next column/row.
;-----------------------------------------------------------------------------------------------------------------------
(setq selsets (vla-get-selectionsets ActDoc))
(vl-catch-all-error-p (vl-catch-all-apply 'vla-add (list selsets "InxCheckSet")))
(setq ssitem (vla-item selsets "InxCheckSet")
        cwidths (acnumlist colwidths)
        rheights (acnumlist rowheights));;col widths & row heights accumulated for polar use
(mapcar '(lambda (pt rh)
 (mapcar '(lambda (x)
   (vl-catch-all-error-p (vl-catch-all-apply 'vla-clear (list ssitem)))
   (vla-selectatpoint ssitem (vlax-3d-point (polar (list (car lpxlist) (+ pt (/ rh 2)) 0.0) 0 x)))
   (if (zerop (vla-get-count ssitem))
         (if check
           (setq hmergelist (replace hmergelist 0 (replace mlist 3 (1+ (vl-position x cwidths)))))
           (setq hmergelist
            (cons
             (setq mlist
               (list
                 (1- (vl-position pt lpylist))
                 (vl-position x cwidths)
                 (1- (vl-position pt lpylist))
                 (1+ (vl-position x cwidths))
               )) hmergelist)
             check T)
         );if
       (setq check nil mlist nil)
   ));lambda
   cwidths
  );mapcar
);lambda
(member (nth 1 lpylist) lpylist)
rowheights
);mapcar

(mapcar '(lambda (pt cw)
  (mapcar '(lambda (x)
    (vl-catch-all-error-p (vl-catch-all-apply 'vla-clear (list ssitem)))
    (vla-selectatpoint ssitem (vlax-3d-point (polar (list (+ pt (/ cw 2)) (car lpylist) 0.0) (* pi 1.5) x)))
    (if (zerop (vla-get-count ssitem))
         (if check
           (setq vmergelist (replace vmergelist 0 (replace mlist 2 (1+ (vl-position x rheights)))))
           (setq vmergelist
            (cons
             (setq mlist
               (list
                 (vl-position x rheights)
                 (vl-position pt lpxlist)
                 (1+ (vl-position x rheights))
                 (vl-position pt lpxlist)
               )) vmergelist)
             check T)
         );if
       (setq check nil mlist nil)
   ));lambda
   rheights
  );mapcar
);lambda
lpxlist
colwidths
);mapcar

(setvar 'nomutt 0)
);progn
(setq hmergelist2 (mapcar '(lambda (b)(list (car b)(cadr b))) hmergelist))
(setq vmergelist2 (mapcar '(lambda (b)(list (car b)(cadr b))) vmergelist))

(mapcar
'(lambda (a / expos)
  (if
   (setq expos (vl-position (list (car a)(cadr a)) vmergelist2))
   (setq dmergelist (cons (list (car a)(cadr a)(caddr (nth expos vmergelist))(cadddr a)) dmergelist))))
   hmergelist
)

(setq	xlapp	   (vlax-get-or-create-object "Excel.Application");(fixo)
	xlbooks  (vlax-get-property xlapp 'Workbooks)
	xlbook	   (vlax-invoke-method xlbooks 'Add)
	xlsheets (vlax-get-property xlbook 'Sheets)
	xlsheet	   (vlax-get-property xlsheets 'Item 1)
	xlcells	   (vlax-get-property xlsheet 'Cells)
	)
(vla-put-visible xlapp :vlax-true)
(vlax-invoke-method xlsheet "Activate")
(setq ecol (conexcelcolumn))
;place text
(mapcar '(lambda (x / r c xlrange)
         (setq r (1+ (cadr (assoc "Position" x))) c (1+ (caddr (assoc "Position" x))))
         (setcelltext xlcells r c (cdr (assoc "Content" x)))
         (setq xlRange (vlax-get-property xlsheet "Range" (strcat (nth (1- c) ecol) (itoa r))))
         (vlax-invoke-method xlRange "Select")
         (setq xlRange (vlax-get-property xlapp "Selection"))
         (Orient xlrange)
         )
         tinfo
)
;place block info
(mapcar '(lambda (x / r c bstring)
         (setq r (1+ (cadr (assoc "Position" x))) c (1+ (caddr (assoc "Position" x))))
         (setq bstring "")
         (if (cdr (assoc "Attributes" x))
         (progn
         (mapcar
          '(lambda (y )
           (setq bstring (strcat ":"(cdr y) bstring)))
           (cdr (assoc "Attributes" x)))
         (setcelltext xlcells r c (strcat "Block:"(cdr (assoc "Name" x)) bstring))
         ));if
         )
         binfo
)
;merge cells

 

(princ "nProcessing Merge Info")
;-------------------------------------------------------------------------------------------------------------------------
(defun convertlist ( mrglist / newmrglist)
  (foreach x mrglist 
   (setq newmrglist (append newmrglist (list (strcat (nth (cadr x) ecol)(itoa (1+ (car x)))":" (nth (cadddr x) ecol)(itoa (1+ (caddr x)))))))
  )
)

(defun applylist ( mrglist / xlRange)
 (foreach x mrglist
 (setq xlRange (vlax-get-property xlsheet "Range" x))
 (vlax-invoke-method xlRange "Select")
 (setq xlRange (vlax-get-property xlapp "Selection"))
 (vlax-put-property xlRange "MergeCells" :vlax-true)
 )
)

(setq hmergelist2 (convertlist hmergelist)
      vmergelist2 (convertlist vmergelist))
(applylist hmergelist2)
(applylist vmergelist2)
 (vlax-invoke-method
   (vlax-get-property xlsheet 'Columns)
   'AutoFit)
;;;  align all columns to center
   (vlax-put-property
     (setq urange(vlax-get-property xlsheet 'UsedRange))
   'HorizontalAlignment -4108)
;;;  draw grid lines
  (setgridlines xlapp urange)

 (mapcar '(lambda (x);(fixo)
	     (vl-catch-all-apply
	       '(lambda	()
		  (vlax-release-object x)
		)
	     )
	   )
	  (list xlcells xlsheet xlsheets xlbook xlbooks xlapp)
  )
  (setq  xlapp nil)
  (gc)(gc)(gc)
(mapcar '(lambda (x)(and x (not (vlax-object-released-p x))(vlax-release-object x))) (list ssitem)) 
(mapcar '(lambda (txt)(redraw txt 1)) textlist);;using redraw function again
(setq *error* oerror)
(vla-EndUndoMark ActDoc)
(princ)
(princ)
);defun


Добро пожаловать!

Войдите или зарегистрируйтесь сейчас!

Войти

  • Обзoр
  • Обновления (19)
  • Рецензии (20)
  • История версий
  • Обсуждение

Страница 5 из 13


  1. Ellesar

    Форумчанин

    Регистрация:
    29 авг 2010
    Сообщения:
    236
    Симпатии:
    92
    Адрес:

    Полюс

    BearDyugin, Александр, ну что посмотрели? есть какие нибудь выводы?

    #81


  2. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.708
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Да, посмотрел, и даже уже исправил, но попутно было ещё много мелких правок и изменений, они пока глючат, на следующей неделю постараюсь выложить исправленную версию.

    #82


  3. Ellesar

    Форумчанин

    Регистрация:
    29 авг 2010
    Сообщения:
    236
    Симпатии:
    92
    Адрес:

    Полюс


  4. zarsai

    Форумчанин

    Регистрация:
    18 сен 2009
    Сообщения:
    87
    Симпатии:
    21
    Адрес:

    МО, г.Чехов

    В чем может быть проблема? Режим: точечный от линейного, указываю точку съемки, полилинию, рамкой выбираю точки, жму «Enter» — получаю ошибку: «; ошибка: неверный тип аргумента: 2D/3D-точка: (nil nil 0)».

    комстрока.jpg

    Вложения:

    #84

    Последнее редактирование: 8 ноя 2019


  5. Мимокрокодил

    Форумчанин

    Регистрация:
    29 янв 2013
    Сообщения:
    1.181
    Симпатии:
    605

    Сделайте все тоже самое в чертеже на шаблоне acadiso.dwt

    #85


  6. zarsai

    Форумчанин

    Регистрация:
    18 сен 2009
    Сообщения:
    87
    Симпатии:
    21
    Адрес:

    МО, г.Чехов

    На домашнем компе создал новый чертеж на acadiso.dwt, скопировал туда полилинию с точками, повторил все, указанное в предыдущем посте — результат тот же.((
    В исходном чертеже на соседней плите перекрытия все сработало нормально. Может косяк быть связан с конфигурацией плиты перекрытия?

    ЗЫ: в старом чертеже на моем шаблоне нарисовал полилинию, накидал точек, все работает.

    косяк1.jpeg

    #86

    Последнее редактирование: 8 ноя 2019


  7. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.708
    Симпатии:
    2.444
    Адрес:

    Сибирь

    К сожалению, на твоём чертеже у себя на ПК воспроизвести ошибку не смог, чтоб исправить.

    #87


    Мимокрокодил нравится это.


  8. zarsai

    Форумчанин

    Регистрация:
    18 сен 2009
    Сообщения:
    87
    Симпатии:
    21
    Адрес:

    МО, г.Чехов

    А меня на двух разных компах, в 17-м и 19-м автокаде одно и то же. Завтра еще на ноуте попробую.

    #88


  9. Sergey B.

    Форумчанин

    Регистрация:
    16 мар 2017
    Сообщения:
    388
    Симпатии:
    95
    Адрес:

    Тула

    Ошибка может быть в самом AutoCAD. Попробуйте Пуск->Все программы->Autodesk (версия)->Восстановить параметры по умолчанию. Настройки слетят и AutoCAD будет в таком виде, как его только установили. Этот способ часто помогает в решении различных ошибок. Чтобы не настраивать AutoCAD каждый раз заново, советую пользоваться возможностью переноса пользовательских настроек. Но сохранять их нужно когда ошибок ещё нет.

    #89


  10. Мимокрокодил

    Форумчанин

    Регистрация:
    29 янв 2013
    Сообщения:
    1.181
    Симпатии:
    605

    У меня тоже все работает в исходном чертеже. Может версия программы какая-то «пыльная»? Давно ставили? Не обновляли?

    #90


  11. zarsai

    Форумчанин

    Регистрация:
    18 сен 2009
    Сообщения:
    87
    Симпатии:
    21
    Адрес:

    МО, г.Чехов

    Дома acad 2019.1.2, Geo_deviation 2.1.2 купленный, когда ставил — не помню; на работе acad 2017, Geo_deviation последний скачаный с beardyugin.com работает третий день, без лицензии.

    #91


  12. zarsai

    Форумчанин

    Регистрация:
    18 сен 2009
    Сообщения:
    87
    Симпатии:
    21
    Адрес:

    МО, г.Чехов

    Прямо мистика какая-то. На работе, на другом компе, автокад 2020, deviations 2.2.3 только что скачаный, файл Чертеж2.dwg — точно такая-же ошибка.
    Может с настройками что-то?
    Хотя я уже по разному перепробовал

    Вложения:

    • настройки.jpg

    #92


  13. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.708
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Проверь чтоб текущий текстовый стиль был не аннотативным. Желательно в новом файле либо старый почистить от блоков Geo_dev_*

    #93


  14. Sergey B.

    Форумчанин

    Регистрация:
    16 мар 2017
    Сообщения:
    388
    Симпатии:
    95
    Адрес:

    Тула

    Съезжают атрибуты текста. На ноутбуке и ПК выглядит одинаково. Шрифт использовал один и тот же — GOST type B.ttf. Как это можно исправить?

    Атрибуты.jpg

    Вложения:

    #94


  15. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.708
    Симпатии:
    2.444
    Адрес:

    Сибирь

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

    #95


  16. Sergey B.

    Форумчанин

    Регистрация:
    16 мар 2017
    Сообщения:
    388
    Симпатии:
    95
    Адрес:

    Тула

    BearDyugin, пробовал. Тоже гостовский, тоже ttf. Результат тот же. Поискав в интернете, нашёл крупицу информации. В AutoCAD выше 2015 версии скорость загрузки объектов разная. Использование ttf шрифтов, в виде атрибутов блока, рано или поздно приведёт к такой ошибке. Советуют использовать shx.
    На будущее учту. А вот что с текущим чертежом можно сделать? Пока нашёл только один выход. Придётся взрывать блок и переносить получившийся текст вручную.

    #96


  17. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.708
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Отредактировать блоки получится быстрее, там их несколько. Отредактировав одно описание, изменятся все его вхождения.

    #97


  18. Sergey B.

    Форумчанин

    Регистрация:
    16 мар 2017
    Сообщения:
    388
    Симпатии:
    95
    Адрес:

    Тула

    BearDyugin, у меня не получилось, к сожалению. Можете пошагово проинструктировать?

    #98


  19. Ellesar

    Форумчанин

    Регистрация:
    29 авг 2010
    Сообщения:
    236
    Симпатии:
    92
    Адрес:

    Полюс


  20. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.708
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Всё так, после редактирования блока, все объекты сразу обновляются, а вот атрибуты нужно обновить, для этого вызываем команду АТРОБНОВИТЬ и ткнуть в отредактированный блок.

    #100

Страница 5 из 13

Поделиться этой страницей

Когда Вы начнёте писать свои программы, то неизбежно столкнетесь с необходимостью решения проблем, которые в программировании носят название отладка программы.

Давайте рассмотрим некоторые технические приемы, которые помогут нам при создании новых программ на языке AutoLISP. К таким приемам относятся:

  • Проверка фрагментов кода в окне «КонсольVisual LISP».
  • Отслеживание парных кавычек.
  • Поиск парных скобок в процессе и после написания кода.
  • Использование окна «Контрольное значение»

Проверка фрагментов кода в окне «КонсольVisual LISP».

Вы можете проверить, насколько правильно вы понимаете синтаксис функции.

Давайте для примера рассмотрим функцию getpoint. Функция  getpoint  помогает нам задать координаты точки при помощи мыши. Давайте поищем эту функцию в справочной системе. Система выдаст следующую информацию. См. Рис. 1.

Отладка программы

Рис. 1. «Окно справка»

 Мы видим, что функция getpoint  имеет два аргумента.

Первый, из которых pt – это координаты точки.

А второй msg — текст, который будет показан пользователю.

При чем оба аргумента не являются обязательными. Это следует из того, что они заключены в квадратные скобки ( [pt] [msg] )

Давайте откроем окно «КонсольVisual LISP» щелкнув по одноименной кнопке. См. Рис. 2.

Отладка программы

Рис. 2.     Добавляем  (getpoint)

Введем функцию (getpoint) без аргументов и нажмем <Enter>.

Активным станем AutoCAD, где надо указать любую точку.

После указания точки, AutoCAD снова вернет нас в редактор Visual LISP.

В консоли появятся координаты указанной точки. См. Рис. 3.

Отладка программы

Рис. 3. Координаты указанной точки.

Теперь давайте попробуем использовать аргументы. Введем функцию с первым аргументом (getpoint pt) и нажмем <Enter>. См. Рис. 4.

Отладка программы

Рис. 4.  Ошибка:  не верный тип аргумента

Консоль выдаст нам сообщение об ошибке: неверный тип аргумента: point: nil.

Очевидно, переменная pt не содержит в себе значения. (значение nil означает, что аргумент не имеет значения). Давайте это проверим. Наберем в следующей строке pt и нажмем <Enter>. См. Рис. 5.

Отладка программы

Рис. 5.    Проверка значения переменной pt.

Консоль подтвердит наши предположения.

Давайте подставим, вместо pt координаты точки начало координат (getpoint (0 0 0)) и нажмем <Enter>. См. Рис. 6.

Отладка программы

Рис. 6.     Ошибка: неверная функция.

Консоль выдает сообщения об ошибке: неверная функция : 0. Скорее всего, координаты в скобках Visual LISP принял за функцию с именем 0 (вспоминаем, что после открывающийся скобки всегда следует имя функции). Как объяснить Visual LISP, что это не функция, а список координат? Для этого есть, два способа:

1)      После открывающийся скобки добавить функцию list(list 0 0 0)

2)      Или перед открывающийся скобкой поставить апостроф: (0 0 0)

Давайте снова напишем функцию, но уже с апострофом (getpoint (0 0 0)) и нажимаем <Enter>. См. Рис. 7.

Отладка программы

Рис. 7.    Добавляем (getpoint (0 0 0)).

Функция сделает активным AutoCAD и мы увидим, что указатель мыши как будто привязан ниточкой к началу координат. См. Рис. 8.

Отладка программы

Рис. 8.   Точка задается относительно другой точки.

И теперь мы можем задать точку, относительно другой точки, координаты которой являются первым аргументом функции getpoint. Щелкните в любом месте, и консоль вернет координаты выбранной точки. См. Рис. 9.

Отладка программы

Рис. 9. Координаты указанной точки.

Давайте теперь разберемся со вторым аргументом. Напомню, что это msg — текст, который будет показан пользователю. Поскольку это текст (string), то писать его нужно в кавычках. Давайте добавим к нашей функции надпись: “Проверка”. См. Рис. 10.

Отладка программы

Рис.. 10.    Добавляем (getpoint(0 0 0) «Проверка»)

Нажимаем <Enter>. И видим, что наша надпись появилась в командной строке. См. Рис. 11.

Отладка программы

Рис. 11. Надпись в командной строке.

Очевидно, что второй аргумент функции getpoint, выдает подсказку пользователю, что в данный момент ему нужно сделать.

Давайте посмотрим пример применения этой функции в программе my_otr, которую я приводил в уроке: Построение отрезков в AutoCAD.

Открываем эту программу, выделяем вторую и третью строки и нажимаем на кнопку «Загрузить выделенный фрагмент». См. Рис. 12.

Отладка программы

Рис. 12. Загрузка выделенного фрагмента.

Далее на просьбу в командной строке, выбираем первую точку (координаты этой точки при помощи функции присвоения setq запоминают в переменной р1). Появится следующая просьба. Вторую точку мы уже выбираем, ориентируясь на первую.

После указания второй точки в окне консоли появятся координаты выбранных точек. См. Рис. 13.

Отладка программы

Рис. 13.     Координаты выбранных точек.

Таким образом, мы проверили, как у нас работает выделенный фрагмент программы.

Я думаю, что после такова исследования, мы уже имеем четкое представление о том, как работает эта функция.

Отслеживание парных кавычек.

Раньше при написании кода в других текстовых редакторах одной из наиболее частых ошибок было не соблюдение правильного количества скобок и кавычек. Напомню, что количество открывающихся скобок и кавычек должно равняться количеству закрывающихся. В других текстовых редакторах отследить это было не всегда легко.

В 2000 году с появлением Visual LISP этот процесс стал значительно более простым.

Давайте начнем с простого и рассмотрим двойные кавычки. В Visual LISP применяется кодирование цветом, поэтому любая строка, заключенная в кавычки, на экране пурпурная. Кодирование цветом применяется в процессе ввода, поэтому после того, как вы поставили открывающиеся кавычки, остальная часть файла становится пурпурной до тех пор, пока вы не введете закрывающиеся кавычки. См. Рис. 14.

Отладка программы

Рис. 14.    Не закрытые кавычки.

Ставим в нужном месте закрывающиеся кавычки, и пурпурным сделается только текст, заключенный в кавычки с двух сторон. См. Рис. 15.

Отладка программы

Рис. 15.   Кавычки с двух сторон.

Стоит отметить, что в программах AutoLISP нужно всегда использовать кавычки вида “ ” (кавычки « » — не воспринимаются)

Поиск парных скобок в процессе и после написания кода.

С парными скобками все немного сложнее. Но в редакторе Visual LISP есть инструменты, которые помогают нам избежать лишних или недостающих скобок.

Прыгающий курсор.

Как только, в процессе написания кода новой программы, вы ставите закрывающую скобку, ваш курсор перескакивает к соответствующей ей открывающей. Если курсор не перескакивает, значит, вы поставили слишком много закрывающихся скобок (нет открывающийся скобки, к которой курсор мог бы переместиться). Если программа короткая, следить за перемещением курсора не сложно. В длинных программах следить за курсором сложнее, потому что в некоторых случаях открывающая скобка может находиться в не видимой области текущего окна.

Двойной щелчок возле скобок.

В редакторе Visual LISP проблема отслеживания перемещений курсора решена при помощи подсветки (выделения). Поместите курсор непосредственно перед  открывающейся скобкой или после закрывающейся и щелкните дважды левой кнопкой мыши. Все содержимое скобок станет подсвеченным. Теперь вы видите, где находится парная скобка. См. Рис. 16.

Отладка программы

Рис. 16.   Выделение содержимого скобок.

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

Для начала определите, как далеко продвинулась ваша программа, прежде чем прекратила работать. Это можно сделать, если проверить значения присвоенные переменным.

Типы переменных.

В программах AutoLISP используются два типа переменных:

1) Системные переменные, которые описаны в AutoCAD (Пример: osmode).

2) Программные переменные, которые описаны и именованы вами.

Программные переменные могут быть как локальными, т. е. сохранять свои значения только на время выполнения программы, так и глобальными, сохраняющими значения после завершения работы программы, в которой они определены.

Когда вы добавляете  в свою программу новую переменную, то по умолчанию она глобальная. Для того, чтобы она стала локальной ее нужно добавить в список временных переменных функции defun. См. Рис. 17.

Отладка программы

Рис. 17.    Список временных переменных.

Окно «Контрольное значение»

Для проверки значения переменных удобнее всего использовать окно «Контрольное значение». Для того, чтобы добавить переменную в это окно, поместите курсор на имени переменной р1 и нажмите на кнопку «Добавить контрольное значение». См. Рис. 18.

Отладка программы

Рис. 18. Добавление переменных в окно «Контрольное значение».

Появится окно «Добавление контрольных значений», в котором нажимаем кнопку «ОК».

Наша переменная появится в окне «Контрольное значение». См. Рис. 19.

Отладка программы

Рис. 19. Окно «Контрольное значение».

Чтобы окно «Добавление контрольных значений» не появлялось, а переменные сразу попадали в окно «Контрольное значение», переменную нужно выделить.

Давайте добавим в это окно и другие переменные.

Когда окно «Контрольное значение» открыто, можно добавлять переменные через кнопку «Добавить контрольное значение» расположенную в этом окне. См. Рис. 20.

Отладка программы

Рис. 20.   Кнопка  «Добавить контрольное значение».

Теперь для того, чтобы увидеть значения переменных, после того как программа прекратила работать, нам необходимо все переменные сделать глобальными. Для этого их нужно убрать из списка временных переменных функции defun.

Затем загрузить нашу программу, нажав на кнопку «Загрузить активное окно редактора». См. Рис. 21.

Отладка программы

Рис. 21.   Загрузка программы.

Далее переходим в AutoCAD, нажав на кнопку «Активизация AutoCAD».

Набираем в командной строке mp_kub. См. Рис. 22.

Отладка программы

Рис. 22.  Вводим в командной строке mp_kub

Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.

Наша программа, которая должна была нарисовать куб. Этого не сделала.

Давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 23.

Отладка программы

Рис. 23. Окно «Контрольное значение»

Мы видим, что переменные р1 и р2 имеют значения, а все остальные переменные нет. Очевидно, что ошибка произошла при расчете переменной р3. Находим эту строчку в программе и видим, что координаты точки р3 рассчитываются относительно самой себя. А должны были рассчитываться относительно точки р2.

Давайте, исправим ошибку, и снова загрузим нашу программу.

Перейдем в AutoCAD, набираем в командной строке mp_kub и нажмем <Enter>.

Указываем базовую точку, и наша программа нарисует куб. См. Рис. 24.

Отладка программы

Рис. 24. Программа нарисовала куб.

Ура заработала!!!

Давайте снова  вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 25.

Отладка программы

Рис. 25.   Все переменные имеют значение.

Мы видим, что все наши переменные имеют значения.

После того, как программа отлажена:

  1. Нужно вернуть все локальные переменные в список временных переменных функции defun.
  2. Сохранить свою LISP-программу.
  3. Закрыть редактор Visual LISP и AutoCAD, чтобы очистить все значения переменных. Этот шаг очень важен. Возможно, что некоторые переменные всё еще сохраняют присвоенные им значения.

Теперь давайте снова запустим  AutoCAD и редактор Visual LISP. Откроем окно «Контрольное значение». Если переменные исчезли, то добавьте их снова. См. Рис. 26.

Отладка программы

Рис. 26.   Все переменные не имеют значений.

Мы видим, что все переменные не имеют значений.

Теперь давайте рассмотрим, как отслеживать значения переменных во время выполнения программы.

Для этого нам необходимо в программе поставить точки останова – места, в которых во время выполнения программа будет останавливаться.

Для этого помещаем курсор в то место программы, где мы хотели бы установить точку останова и нажимаем на кнопку «Точка останова вкл/выкл». См. Рис. 27.

Отладка программы

Рис. 27.   Точка останова.

Точка останова выделится красным.

Давайте добавим еще пару точек останова, загрузим программу и перейдем в AutoCAD. См. Рис. 28.

Отладка программы

Рис. 28.    Добавляем точки останова и загружаем программу.

Набираем в командной строке mp_kub. Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.

AutoCAD вернет нас в редактор Visual LISP, и мы увидим, что наша программа остановилась в первой точки останова. См. Рис. 29.

Отладка программы

Рис. 29.   Первая точка останова.

Обратим внимания на окно «Контрольное значение». В данной точки останова переменная р1 уже имеет текущее значение. Для продолжения программы нажимаем на кнопку «Продолжить». См. Рис. 30.

Отладка программы

Рис. 30.   Следующая точка останова.

Наша программа остановиться в следующей точке останова. В этой точке уже пять переменных будут иметь свои текущие значения.

Снова нажимаем на кнопку «Продолжить». См. Рис. 31.

Отладка программы

Рис. 31.   Последняя точка останова.

Программа остановиться в последней точке останова. В этой точке уже все переменные имеют свои текущие значения.

Для того чтобы завершить выполнение программы, снова нажимаем на кнопку «Продолжить».

В конце программы мы снова окажемся в  AutoCAD, где будет нарисован куб. См. Рис. 32.

Отладка программы

Рис. 32.    Программа нарисовала куб.

Теперь давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 33.

Отладка программы

Рис. 33.     Все переменные не имеют значений.

По окончании программы все переменные снова не имеют значений.

Таким образом, используя точки останова и окно «Контрольное значение», можно отслеживать значения переменных в любой точке во время выполнения программы.

Чтобы удалить все точки останова по окончании работы с ними, нажмите клавиши <Shift>+<Ctrl>+<F9>.

И так в этом уроке мы рассмотрели основные приемы отладки программы AutoLISP.

К этим приемам относятся:

  • Проверка фрагментов кода в окне «Консоль Visual LISP».
  • Отслеживание парных кавычек.
  • Поиск парных скобок в процессе и после написания кода.
  • Использование окна «Контрольное значение»

Искренне надеюсь, что отладка программ AutoLISP стала для Вас теперь легкой, занимательной головоломкой.

Пишите в комментариях:

Была ли для Вас полезной информация, данная в этом уроке?

Какие способы отладки используете Вы?

На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?

Я с удовольствием отвечу на ваши комментарии.

Если вы хотите получать новости с моего сайта. Оформляйте подписку.

До новых встреч.

 «Автор: Михаил Орлов»

Google

Также на эту тему Вы можете почитать:

Студворк — интернет-сервис помощи студентам

Здравствуйте, помогите пожалуйста с прогой..
вот мое задание: Извлечение данных о примитивах чертежа. Путём доступа к графической базе данных чертежа получить информацию (имя слоя, номер цвета, тип линии, координаты вершин, начальной и конечной точки) о примитивах: линиях, полилиниях, сплайнах. Записать полученную информацию в заданный пользователем файл. Диалоговое окно должно иметь возможность выбора типов примитивов, и отображать их количество в соответствии с видом диалогового окна на рисунке.

вот мой код

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
(defun sav()
(setq f (open text "W"))
 
 
(if (= (atoi veb_line) 1)
 (  progn
(setq sdel (ssget "X" '((0 . "LINE"))))
(if (/= sdel nil)
( progn
(setq i 0)
(while (< i (sslength sdel))
(setq q (entget (ssname sdel i)))
(setq lin (cdr (assoc 62 q)))
(setq f (open text "A"))
(write-line "" f)
  (princ "Line_" f)
  (princ i f)
  (princ "; " f)
  (princ "color=" f)
  (princ lin f)
  (princ "; " f)
(setq lin (cdr (assoc 10 q)))
  (princ "begin_point=" f)
  (princ lin f)
  (princ "; " f)
(setq lin (cdr (assoc 11 q)))
  (princ "end_point=" f)
  (princ lin f)
  (princ "; " f)
(setq lin (cdr (assoc 8 q))) 
  (princ "Layer_name=" f)
  (princ lin f)
  (princ "; " f)
 (setq lin (cdr (assoc 6 q))) 
  (princ "Type_line=" f)
  (princ lin f)
  (princ "." f)
  
(write-line "" f)  
(close f)  
(setq i(+ i 1))
(setq f (open text "A"))
))
)
 )
 )
 
 
(if (= (atoi veb_polyline) 1)
(  progn
(setq sdell (ssget "X" '((0 . "LWPOLYLINE"))))
(if (/= sdell nil)
( progn
(setq j 0)
(while (< j (sslength sdell)) 
(setq r (entget (ssname sdell j)))
(setq pol (cdr (assoc 62 r)))
(setq f (open text "A"))
(write-line "" f)
  (princ "Polyline_" f)
  (princ j f)
  (princ "; " f)
  (princ "color=" f)
  (princ pol f)
  (princ "; " f)  
(princ "Coordinates=" f)  
(foreach n r (if (= (car n) 10)
                     (progn
                     (setq qxc (cdr n))
                     (princ qxc f)
                     (princ "; " f)
                     )
                     )
               
)
(setq a 0)
 
(foreach n r (if (= (car n) 42)
                    (progn
                    (setq a (+ a 1))
                    (if (/= (cdr n) 0)
                        (progn
                        (setq aa a)
                        (setq zas (cdr n))
                        (setq bubl zas)
                        (setq aaa (+ aa 1))
                        (setq b 0)
                                    (foreach n r (if (= (car n) 10)
                        (progn
                        (setq b (+ b 1))
                        (if (= b aa)
                        (setq pt1 (cdr n))
                        )
                        (if (= b aaa)
                        (setq pt2 (cdr n))
                        )
(if (and (/= bubl nil) (/= bubl 0) )
 (progn
(setq   dst (distance pt1 pt2)
    rad (+ (* (/ dst 2.0) bubl) (/ (- (* (/ dst 2.0) (/ dst 2.0))
        (* (/ (* dst bubl) 2.0) (/ (* dst bubl) 2.0))) (* dst bubl)))
    cnt (polar
        (polar pt1 (angle pt1 pt2) (/ dst 2.0))
        (- (angle pt1 pt2) (/ pi 2.0))
        (- (* (/ dst 2.0) bubl) rad))
)
(setq pt (strcat "n" "t" " Radius=" (rtos (abs rad) 2 3) "; " "Centr=(" (rtos (nth 0 cnt) 2 3) " " (rtos (nth 1 cnt) 2 3) "); "))
(princ pt f)
(setq bubl 0)
 
 
 )
)
                        )
                        )
                                        )
                        )
                    )
                    )
            )
)
;(setq b 0)
; (foreach n r (if (= (car n) 10)
                ; (progn
                  ; (setq b (+ b 1))
                  ; (if (= b aa)
                   ; (setq pt1 (cdr n))
                  ; )
                  ; (if (= b aaa)
                   ; (setq pt2 (cdr n))
                  ; )
                ; )
              ; )
; )
 
; (if (/= bubl 0)
 ; (progn
; (setq     dst (distance pt1 pt2)
    ; rad   (+ (* (/ dst 2.0) bubl) (/ (- (* (/ dst 2.0) (/ dst 2.0))
        ; (* (/ (* dst bubl) 2.0) (/ (* dst bubl) 2.0))) (* dst bubl)))
    ; cnt   (polar
        ; (polar pt1 (angle pt1 pt2) (/ dst 2.0))
        ; (- (angle pt1 pt2) (/ pi 2.0))
        ; (- (* (/ dst 2.0) bubl) rad))
; )
; (setq pt (strcat "n" "t" " Radius=" (rtos rad 2 3) "; " "Centr=(" (rtos (nth 0 cnt) 2 3) " " (rtos (nth 1 cnt) 2 3) "); "))
; (princ pt f)
 
 ; )
; )
(setq pol (cdr (assoc 8 r))) 
  (princ "Layer_name=" f)
  (princ pol f)
  (princ "; " f)
 (setq pol (cdr (assoc 6 r))) 
  (princ "Type_line=" f)
  (princ pol f)
  (princ "." f)
  
(write-line "" f)  
(close f)  
(setq j(+ j 1))
(setq f (open text "A"))
)
)
)
 )
 )
 
 
(if (= (atoi veb_spline) 1)
(  progn
(setq sdelll (ssget "X" '((0 . "SPLINE"))))
(if (/= sdelll nil)
( progn
(setq k 0)
(while (< k (sslength sdelll)) 
(setq nabor_spline (entget (ssname sdelll k)))
(setq pol (cdr (assoc 62 nabor_spline)))
(setq f (open text "A"))
(write-line "" f)
  (princ "Spline_" f)
  (princ k f)
  (princ "; " f)
  (princ "color=" f)
  (princ pol f)
  (princ "; " f)
  (princ "Coordinates=" f)
(foreach n nabor_spline  (if (= (car n) 10)
                      (progn
                     (setq qwee (cdr n))
                     (princ qwee f)
                     (princ "; " f)
                       )
                     )              
)
(setq pol (cdr (assoc 8 nabor_spline))) 
  (princ "Layer_name=" f)
  (princ pol f)
  (princ "; " f)
 (setq pol (cdr (assoc 6 nabor_spline))) 
  (princ "Type_line=" f)
  (princ pol f)
  (princ "." f)
  
(write-line "" f)  
(close f)  
(setq k(+ k 1))
(setq f (open text "A"))
)
 )
 )
 (setq f (open text "A"))
 (close f)
 ))
)
 
 
 
 
 
 
 
(defun run()
  (if (not (new_dialog "MY" dcl_id)) (exit))
 
(setq sdel (ssget "X" '((0 . "LINE"))))
   (if (/= sdel nil)
  (setq num_line (itoa (sslength sdel)))
    )
  (setq sdell (ssget "X" '((0 . "LWPOLYLINE"))))
   (if (/= sdell nil) 
  (setq num_polyline (itoa (sslength sdell)))
    )
  (setq sdelll (ssget "X" '((0 . "SPLINE"))))
   (if (/= sdelll nil)
  (setq num_spline (itoa (sslength sdelll)))
    )
 
(set_tile "num_spline" num_spline )
(set_tile "num_polyline" num_polyline )
(set_tile "num_line" num_line )
(set_tile "text" text )
 
 
(action_tile "text" "(setq text $value)")
(action_tile "tg_spline" "(setq veb_spline  $value)" )
(action_tile "tg_polyline" "(setq veb_polyline $value)")
(action_tile "tg_line" "(setq veb_line $value)")
(action_tile "bt_Accept" "(done_dialog 1)")
(action_tile "bt_Cancel" "(setq w_n 0)")
 
(action_tile "bt_Accept" "(done_dialog 1)")
(action_tile "bt_Cancel" "(setq w_n 0)")
 
(setq w_n (start_dialog))
  (if (= w_n 1) (sav))
)
 
(defun c:MY ()
  (setq w_n 2  text "D:\text.txt" num_polyline "0" num_line "0" num_spline "0" i 0 j 0 k 0 veb_polyline "0" veb_spline "0" veb_line "0") 
  (setq dcl_id (load_dialog "MY.dcl"))
  (while (> w_n 0) (run))
  (unload_dialog dcl_id)
)

диалоговое окно:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
 MY : dialog {
label = "Извлечение данных о примитивах";
    fixed_width = true;
    fixed_height = true;
    :edit_box {
         label = "Имя файла";
         fixed_width = true;
         edit_width=15;
         alignment=left;
         key="text";}
    :row {
         :column {
             label = "Выбор примитивов";
             fixed_width = true;
             height = 6;
             fixed_height = true;
             children_fixed_heigth = true;
             children_fixed_width = true;
             alignment=left;
             :toggle{
                label="Сплайны";
                key="tg_spline";
                            value="0";}
                 :toggle{
                label="Полилинии";
                key="tg_polyline";
                            value="0";}
             :toggle{
                label="Линии";
                key="tg_line";
                value="0";}
            }
         :column {
             label = "Найдено примитивов";
             fixed_width = true;
             height = 6;
             fixed_height = true;
             children_fixed_heigth = true;
             children_fixed_width = true;
             alignment=left;
             :edit_box {
                label = "Сплайны";
                fixed_width = true;
                edit_width=4;
                alignment=right;
                key="num_spline";}
             :edit_box {
                label = "Полилинии";
                fixed_width = true;
                edit_width=4;
                alignment=right;
                key="num_polyline";}
             :edit_box {
                label = "Линии";
                fixed_width = true;
                edit_width=4;
                alignment=right;
                key="num_line";}
                }
        }
    
    :row{label = "";
        fixed_width=true;
        alignment = left;
            :button{
            key="bt_Accept";
            label="Готово";
            is_default=true;
            is_cancel =false;
            is_tab_stop = true;
            fixed_width = true;
            }
 
            :button{                
            key="bt_Cancel";
            label="Отмена";
            is_default=false;  //Не срабатывает, если нажат Enter
            is_cancel=true;    //Срабатывает, если нажат Р или Esc
            is_tab_stop = true;//Фокус переключается между кнопками
            fixed_width = true;//Ширина кнопки - по ширине надписи 
            }
        
    }
 
}

программа работает нормально но вот когда рисуешь полилинию состоящую из дуг, то при попытке извлечь о ней информацию выдает ошибку:неверный тип аргумента:2D/3D точка :nil
что нужно сделать что бы программа заработала нормально???

  • Ошибка невозможно записать файлы проверьте адреса результатов cinema 4d
  • Ошибка неверный суффикс инструкции для push
  • Ошибка невозможно записать файлы на диск
  • Ошибка неверный синтаксис для типа integer
  • Ошибка невозможно записать на sd карту samsung