Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как узнать длинну всех выделенных линий ?

Как узнать длинну всех выделенных линий ?

Ответ
Поиск в этой теме
Непрочитано 25.09.2006, 21:01 #1
Как узнать длинну всех выделенных линий ?
bdfy
 
Регистрация: 30.04.2005
Сообщений: 141

Как узнать длинну всех выделенных линий ? Есть схемка электросети ( натурально сетка из 2-3 неправильной формы ячеек, бывает не замкнутые ), линии ее образующие все прямые - Мне надо длинну общую всех линий узнать. Как ? length команды нет, area это не то, perimeter тоже... есть ведь команда наверное, подскажите .
Просмотров: 24198
 
Непрочитано 25.09.2006, 21:18
#2
kha

BIM, С#, AutoCAD, LISP
 
Регистрация: 15.03.2006
Дуброво
Сообщений: 657


учитесь пользоваться поиском по форуму, тема уже поднималась

Цитата:
Сообщение от Profan
Можно здесь посмотреть:
http://dwg.ru/forum/viewtopic.php?t=953&
И здесь:
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=20211Ym
И еще, наверное, есть куча готовых программ.
__________________
"Молодой человек, Вы не представляете всей широты поставленной перед Вами задачи." © Панкратова Г.Е.
kha вне форума  
 
Автор темы   Непрочитано 26.09.2006, 09:21
#3
bdfy


 
Регистрация: 30.04.2005
Сообщений: 141


ОК. с этим ясно. ( я в поиск похоже "длинна" вбивал, вот и не нашел )
Другая задача: надписать размер всех линий (каждой в отдельности ) сверху (т.е над линией , паралельно ей ). Это реально ? чтоб размерных линий не было ?
Автопростановщики размеров конечно есть, но образмерят они ведь по госту , а не как мне надо
bdfy вне форума  
 
Непрочитано 26.09.2006, 09:27 Перевед
#4
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Скачай утилиту KitoX из Download
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 26.09.2006, 10:04
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Есть интересное решение через реакторы. Длина выбранных элементов отражается в статусной строке.
Команды
VlrOn - включает реактор
VlrOFF - отключает реактор
MM - для указания масштабного коэффициента, высоты текста, точности округления
MC - для (вдруг понадобится) очистки MODEMACRO
LP - печать полученного результата. Сам результат хранится в глобальной переменной *MIP-LENGTH*. Можно посмотреть, набрав !*MIP-LENGTH* в командной строке
Код:
[Выделить все]
; http://forum.dwg.ru/showthread.php?p=93365#post93365
;http://forum.dwg.ru/showthread.php?t=842&page=4
;http://www.cadtutor.net/forum/showthread.php?t=13950
;VlrOn - включает реактор
;VlrOFF - отключает реактор
;MM -  для указания масштабного коэффициента, высоты текста, точности округления
;MC - для (вдруг понадобится) очистки MODEMACRO
;LP - печать полученного результата
(vl-load-com)
(if (null *MIP-MODEMACRO-HTXT*)(setq *MIP-MODEMACRO-HTXT* 3.0)) ;_Высота текста
(if (null *MIP-MODEMACRO-RTOS*)(setq *MIP-MODEMACRO-RTOS* -1.0));_Округление -1-LUPREC
(VL-PROPAGATE '*MIP-MODEMACRO-HTXT*)
(VL-PROPAGATE '*MIP-MODEMACRO-RTOS*)

;;=============== Реакторы =======================
(defun C:VlrOFF ()
      (setq *vlr-mis* nil) 
    (vlr-remove-all :vlr-miscellaneous-reactor)
  (setvar "modemacro" (if (= (type *MIP-MODEMACRO-OLD*) 'STR) *MIP-MODEMACRO-OLD* ""))
  (princ "\nРеактор длинны отключен")(princ)
  )
(defun C:VlrOn ( )
(if *vlr-mis* 
  (progn 
    (setq *vlr-mis* nil) 
    (vlr-remove-all :vlr-miscellaneous-reactor))) 
(if (not *vlr-mis*) 
  (setq   *vlr-mis* (vlr-miscellaneous-reactor 
          (list '("Rname" "MipSelChange")) 
          '((:vlr-pickfirstmodified . selchange)))))
  (princ "\nРеактор длинны включен")(princ)
  )

(defun selchange (reactor event / selset sum_len item_name nstyle err len ent ds)
  (if (and (VLR-added-p reactor);_активизирован реактор
           (= (cadr(assoc "Rname" (vlr-data reactor))) "MipSelChange")
           )
    (progn 
  (if (null *MIP-MODEMACRO-OLD*)(setq *MIP-MODEMACRO-OLD* (getvar "MODEMACRO"))) 
  (setq sum_len 0.0)
  (setq err (vl-catch-all-apply '(lambda ()(and (setq selset   (vla-get-pickfirstselectionset 
           (vla-get-activedocument (vlax-get-acad-object))))
      (> (vla-get-count selset) 0)))))
  (if (and (not (vl-catch-all-error-p err))
	   err)
  (progn 
   (vlax-for   item selset
     (cond
       	 ((= (strcase (vla-get-objectname item)) "ACDBMLINE")
	  (setq ent (entget(vlax-vla-object->ename item)))
	  (setq len (mapcar 'cdr (vl-remove-if-not (function (lambda (x) (= 11 (car x)))) ent)))
	  (if (= 2 (logand 2 (cdr(assoc 71 ent))))(setq len (append len (list (car len)))))
	  (setq ds (car len))
          (setq sum_len (+ sum_len (apply '+ (mapcar '(lambda(x / dst)(setq dst (distance ds x))(setq ds x) dst) len))))
	 )
         ((vlax-property-available-p item 'length)
	    (setq sum_len (+ sum_len (if (vl-catch-all-error-p(vl-catch-all-apply '(lambda()(setq len (vla-get-length item))))) 0 len))))
	 ((member (setq item_name (strcase (vla-get-objectname item) t)) '("acdbcircle" "acdbarc" "acdbellipse" "acdbspline"))
            (setq sum_len (+ sum_len 
                            (cond ((= item_name "acdbcircle")(* 2 pi (vla-get-radius item))) 
                                  ((= item_name "acdbarc")(vla-get-ArcLength item))
                                  ((member item_name '("acdbellipse" "acdbspline")) 
                                    (vlax-curve-getDistAtParam item (vlax-curve-getEndParam item)))
		                  (t 0.0))))
	  )
	 (t nil)
	   )
   ) ;_ end of vlax-for 
   (if (member (type *MIP-MODEMACRO-SCALE*) '(INT REAL)) 
   (progn 
   (setq item_name (strcat " (K=" (VL-PRINC-TO-STRING *MIP-MODEMACRO-SCALE*) ")")) 
   (setq sum_len (* sum_len *MIP-MODEMACRO-SCALE*)) 
   ) 
   (setq item_name " (K=1)" *MIP-MODEMACRO-SCALE* 1) 
   )
   (setq *MIP-LENGTH* sum_len)
      (setvar "modemacro" (strcat "Выбрано="
				  (itoa (vla-get-count selset))
				  " Длина="
				  (rtos sum_len 2 (if (< *MIP-MODEMACRO-RTOS* 0)(getvar "LUPREC") *MIP-MODEMACRO-RTOS*))
				  (strcat item_name " MM-масштаб LP-печать")))
      ) ;_ end of progn 
     (progn
      (setvar "modemacro" (if (= (type *MIP-MODEMACRO-OLD*) 'STR) *MIP-MODEMACRO-OLD* ""))
      (if (wcmatch (getvar "modemacro") "Выбрано=*")(setvar "modemacro" ""))
      (setq *MIP-MODEMACRO-OLD* nil)
      )
    )
      )))
(defun c:MM ( / buf )
  (initget 7)
  (setq *MIP-MODEMACRO-SCALE* (getreal "\nНовый масштабный коэффициент: "))
  (initget 6)
  (princ "\nВысота текста <")(princ *MIP-MODEMACRO-HTXT*)(princ ">: ") 
  (if (setq buf (getdist))(setq *MIP-MODEMACRO-HTXT* buf))
  (initget 4 "L")
  (princ "\nТочность округления [Luprec] <")
  (if (< *MIP-MODEMACRO-RTOS* 0)(princ "Luprec")(princ *MIP-MODEMACRO-RTOS*))
  (princ ">: ") 
  (if (setq buf (getint))(setq *MIP-MODEMACRO-RTOS* (if (numberp buf) buf -1)))
  (VL-PROPAGATE '*MIP-MODEMACRO-HTXT*)
  (VL-PROPAGATE '*MIP-MODEMACRO-RTOS*)
  (VL-PROPAGATE '*MIP-MODEMACRO-SCALE*)

  (princ)
  )
(defun C:MC ()(setvar "modemacro" "")(princ))
(defun c:LP ( )(if (= (type *MIP-LENGTH*) 'REAL)(progn
(vla-addtext(vla-get-block(vla-get-ActiveLayout(vla-get-ActiveDocument(vlax-get-acad-object))))
(rtos *MIP-LENGTH* 2 (if (< *MIP-MODEMACRO-RTOS* 0)(getvar "LUPREC") *MIP-MODEMACRO-RTOS*))  
(vlax-3d-point '(0 0 0)) *MIP-MODEMACRO-HTXT*)(princ "\n Укажите точку вставки текста:")
(command "_.copybase" '(0 0 0) (entlast) "" "_.erase" (entlast) "" "_.pasteclip" pause)))
(princ))
Вариант без реакторов

Последний раз редактировалось VVA, 07.11.2012 в 14:35. Причина: Новая версия
VVA вне форума  
 
Непрочитано 26.09.2006, 10:42
#6
taras

конструктор
 
Регистрация: 27.10.2005
Сообщений: 530


Утилита Vetcad
taras вне форума  
 
Непрочитано 26.09.2006, 11:33
#7
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


мои 16 копеек:
http://dwg.ru/forum/viewtopic.php?p=...ghlight=#73326
Zouss вне форума  
 
Непрочитано 26.09.2006, 12:08
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


>Zouss Я этот вариант и показал в посте №5,только добавлены еще сплайны и эллипсы и восстановление предыдущего состояния MODEMACRO. Добавлена возможность использовать масштабный коэффициент.
VVA вне форума  
 
Непрочитано 26.09.2006, 12:56
#9
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


звиняйте тормозю...

не из вредности, а усовершенствования для - modemacro не восстанавливается, а обнуляется
Zouss вне форума  
 
Непрочитано 26.09.2006, 13:07
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


>ZoussДавай разбираться
1.Начинаем новый рисунок.
2. Рисуем пару линий
3.Грузим код
4.В ком. строке MODEMACRO - значение TEST
5.Выделяем отрезки смотрим статусную строку
6.Жмем ESC смотрим статусную строку
7.Что видим?

Команда MC очистит MODEMACRO
VVA вне форума  
 
Непрочитано 26.09.2006, 13:30
#11
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


Цитата:
Сообщение от VVA
Команда MC очистит MODEMACRO
ну а я про что - именно очистит... а ежели у меня там уже чево-то было?
кроме того у начинающих, в смысле если acad без аэродинамического обвеса там без кенгурятников и светодиодов прога и не сработает ибо (vl-load-com) в начале нету
Zouss вне форума  
 
Автор темы   Непрочитано 26.09.2006, 13:43
#12
bdfy


 
Регистрация: 30.04.2005
Сообщений: 141


Цитата:
Скачай утилиту KitoX из Download
В инфотулз там можно только инфу по одному обьекту вывести за один клик. да и инфа паралельно оси Х, а не образмериваемой линии. так что не подходит.
VVA
Цитата:
Длина выбранных элементов отражается в статусной строке
а мне их надо нанести на схему.
Цитата:
Утилита Vetcad
А это вообще к чему ? не вижу там подобных возможностей.
bdfy вне форума  
 
Непрочитано 26.09.2006, 13:51
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
а ежели у меня там уже чево-то было?
Дык ты ее не вызывай, это для тех, кто не знает про MODEMACRO, да и MC набрать быстрее.
Реакторы должны когда выбраны объеты показать длину, а когда нет восстановить пред. значение modemacro.
(vl-load-com) - постоянно забываю. У меня грузится автоматом.
Скорее всего ты прав - в MC - надо сделать запрос.
Код:
[Выделить все]
(vl-load-com)
(if *vlr-obj* 
  (progn 
    (setq *vlr-obj* nil) 
    (vlr-remove-all :vlr-miscellaneous-reactor))) 
(if (not *vlr-obj*) 
  (setq   *vlr-obj* (vlr-miscellaneous-reactor 
          nil 
          '((:vlr-pickfirstmodified . selchange))))) 


(defun selchange (reactor event / selset sum_len item_name) 
  (if (null *MIP-MODEMACRO-OLD*)(setq *MIP-MODEMACRO-OLD* (getvar "MODEMACRO"))) 
  (setq sum_len 0.0) 
  (if (and (setq selset   (vla-get-pickfirstselectionset 
           (vla-get-activedocument (vlax-get-acad-object)))) 
      (> (vla-get-count selset) 0)) 
  (progn 
   (vlax-for   item selset 
   (if (vlax-property-available-p item 'length) 
     (setq sum_len (+ sum_len (vla-get-length item))) 
     (setq   item_name (strcase (vla-get-objectname item) t) 
      sum_len (+ sum_len 
   (cond ((= item_name "acdbcircle")(* 2 pi (vla-get-radius item))) 
         ((= item_name "acdbarc")(vla-get-ArcLength item)) 
         ((member item_name '("acdbellipse" "acdbspline")) 
          (vlax-curve-getDistAtParam item (vlax-curve-getEndParam item))) 
         (t 0.0)))) 
     ) ;_ end of if 
   ) ;_ end of vlax-for 
   (if (member (type *MIP-MODEMACRO-SCALE*) '(INT REAL)) 
   (progn 
   (setq item_name (strcat " (K=" (VL-PRINC-TO-STRING *MIP-MODEMACRO-SCALE*) ")")) 
   (setq sum_len (* sum_len *MIP-MODEMACRO-SCALE*)) 
   ) 
   (setq item_name " (K=1)" *MIP-MODEMACRO-SCALE* 1) 
   ) 
      (setvar "modemacro" (strcat "Выбрано=" (itoa (vla-get-count selset)) " Длина=" (rtos sum_len 2 4) (strcat item_name " MM-изм. масштаб"))) 
      ) ;_ end of progn 
     (progn 
      (setvar "modemacro" (if (= (type *MIP-MODEMACRO-OLD*) 'STR) *MIP-MODEMACRO-OLD* "")) 
      (setq *MIP-MODEMACRO-OLD* nil) 
      ) 
    ) ;_ end of if 
  ) ;_ end of defun 
(defun c:MM ( ) 
  (initget 7) 
  (setq *MIP-MODEMACRO-SCALE* (getint "\nНовый масштабный коэффициент: "))(princ)) 
(defun C:MC ( / str)
  (princ "\nНовое значение MODEMACRO <")
  (princ (getvar "MODEMACRO"))
  (princ ">: ")
  (setq str (getstring t))
  (if (= str "")(setq str (getvar "MODEMACRO")))
  (setvar "modemacro" str)(princ))
И для начинающих Как сохранить программный код на своем компьютере?
VVA вне форума  
 
Непрочитано 26.09.2006, 14:13
#14
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
а мне их надо нанести на схему
А вначале то было
Цитата:
Как узнать длинну всех выделенных линий ?
Узнать и нанести немного разные вещи :wink: :wink:

Код:
[Выделить все]
(vl-load-com)
(if *vlr-obj* 
  (progn 
    (setq *vlr-obj* nil) 
    (vlr-remove-all :vlr-miscellaneous-reactor))) 
(if (not *vlr-obj*) 
  (setq   *vlr-obj* (vlr-miscellaneous-reactor 
          nil 
          '((:vlr-pickfirstmodified . selchange))))) 


(defun selchange (reactor event / selset sum_len item_name) 
  (if (null *MIP-MODEMACRO-OLD*)(setq *MIP-MODEMACRO-OLD* (getvar "MODEMACRO"))) 
  (setq sum_len 0.0) 
  (if (and (setq selset   (vla-get-pickfirstselectionset 
           (vla-get-activedocument (vlax-get-acad-object)))) 
      (> (vla-get-count selset) 0)) 
  (progn 
   (vlax-for   item selset 
   (if (vlax-property-available-p item 'length) 
     (setq sum_len (+ sum_len (vla-get-length item))) 
     (setq   item_name (strcase (vla-get-objectname item) t) 
      sum_len (+ sum_len 
   (cond ((= item_name "acdbcircle")(* 2 pi (vla-get-radius item))) 
         ((= item_name "acdbarc")(vla-get-ArcLength item)) 
         ((member item_name '("acdbellipse" "acdbspline")) 
          (vlax-curve-getDistAtParam item (vlax-curve-getEndParam item))) 
         (t 0.0)))) 
     ) ;_ end of if 
   ) ;_ end of vlax-for 
   (if (member (type *MIP-MODEMACRO-SCALE*) '(INT REAL)) 
   (progn 
   (setq item_name (strcat " (K=" (VL-PRINC-TO-STRING *MIP-MODEMACRO-SCALE*) ")")) 
   (setq sum_len (* sum_len *MIP-MODEMACRO-SCALE*)) 
   ) 
   (setq item_name " (K=1)" *MIP-MODEMACRO-SCALE* 1) 
   ) 
      (setvar "modemacro" (strcat "Выбрано=" (itoa (vla-get-count selset)) " Длина=" (rtos sum_len 2 4) (strcat item_name " MM-изм. масштаб")))
      (setq *MIP-LENGTH* sum_len)
      ) ;_ end of progn 
     (progn 
      (setvar "modemacro" (if (= (type *MIP-MODEMACRO-OLD*) 'STR) *MIP-MODEMACRO-OLD* "")) 
      (setq *MIP-MODEMACRO-OLD* nil) 
      ) 
    ) ;_ end of if 
  ) ;_ end of defun 
(defun c:MM ( ) 
  (initget 7) 
  (setq *MIP-MODEMACRO-SCALE* (getint "\nНовый масштабный коэффициент: "))(princ)) 
(defun C:MC ( / str)
  (princ "\nНовое значение MODEMACRO <")
  (princ (getvar "MODEMACRO"))
  (princ ">: ")
  (setq str (getstring t))
  (if (= str "")(setq str (getvar "MODEMACRO")))
  (setvar "modemacro" str)(princ))
(defun c:LP ( / dat pt old_cmd osm *error*) 
 (defun *error* (msg)(princ msg)(setvar "OSMODE" osm)) 
 (setq old_cmd  (getvar "CMDECHO") 
           osm  (getvar "OSMODE")) 
 (setvar "CMDECHO" 0) 
 (setq dat *MIP-LENGTH*)
 (if (numberp dat )
   (progn
     (initget 1)
 (setq dat (rtos dat 2 4)
        pt (getpoint "\nТочка вставки текста: ")) 
 (setvar "OSMODE" 0) 
(if (zerop (cdr (assoc 40 (tblsearch "STYLE" (getvar "TEXTSTYLE"))))) 
     ;; нулевая высота текста 
      (COMMAND "_TEXT" pt 3.0 0 dat) 
     ;; фиксированнная высота 
      (COMMAND "_TEXT" pt 0 dat))
 ;;;Высота 3 ===== 
 (setq strok (entget(entlast))) 
 (setq strok (subst (cons 40 3.0)(assoc 40 strok) strok)) 
 (entmod strok)
     ))
 ;;;======  
 (setvar "CMDECHO" old_cmd) 
 (setvar "OSMODE" osm) 
 (princ) 
)
Здесь добавлена команда LP(Length Print). После того как в статусной строке увидел нужное число. Набери в ком. строке LP
VVA вне форума  
 
Автор темы   Непрочитано 26.09.2006, 14:29
#15
bdfy


 
Регистрация: 30.04.2005
Сообщений: 141


Цитата:
Узнать и нанести немного разные вещи
правильно. как узнать разобрались после первого же поста. потом я вопрос поменял. ладно, в след. раз отдельную тему создам...

Цитата:
Здесь добавлена команда LP(Length Print)
Все хорошо, но прочитайте же мой второй пост
Цитата:
Другая задача: надписать размер всех линий (каждой в отдельности ) сверху (т.е над линией , паралельно ей ).
Спасибо вам конечно но вы совсем другую задачу решили (из первого поста).
Сами схемы выложу для примера. одна линия в самом низу там подписана. Вот надо так подписать все линии на всех схемах.
[ATTACH]1159266839.rar[/ATTACH]
bdfy вне форума  
 
Непрочитано 26.09.2006, 16:57
#16
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


Цитата:
...разобрались после первого же поста. потом я вопрос поменял...
bdfy, ты настоящий заказчик

Цитата:
Автопростановщики размеров конечно есть, но образмерят они ведь по госту , а не как мне надо
предлагаю решение стандартными средствами - создаем размерный стиль с выключенными размерными и выносными линиями, расположением тескта всегда горизонтально и префиксом размерного числа L=. Далее выбираем _dimaligned, щелкаем правой кнопкой мыши или Enter, щелкаем отрезок, располагаем текст. Минус - только по одному объекту, столь нужная вам сумма не считается, зато как элегантно и связь с объектом имеется. А так попробуйте модифицировать любую из предложенных программ под себя - это легче чем кажется.

Про MC - я бы сохранял текущее значение modemacro в какой нибудь переменной, да хотя бы в Users3, а по MC восстанавливливал бы ее оттуда без спроса... никто бы ничево бы и не заметил бы
Zouss вне форума  
 
Автор темы   Непрочитано 26.09.2006, 18:39
#17
bdfy


 
Регистрация: 30.04.2005
Сообщений: 141


Всем может и хорошо ваше решение ,но раз 100 тыкать по мышке мне не улыбается. я лучше пару дней на поиск решения убью, меня никто пока не гонит.
Цитата:
А так попробуйте модифицировать любую из предложенных программ под себя - это легче чем кажется.
Алгоритм то я себе примерно представляю, но в лиспе не знаю ни команд , ни главное синтаксиса языка
В цикле ( он и сейчас есть раз общую длинную считаем )
1. нашли линию, узнали длинну
2. нашли центр линии и ее направление.
3. перпендикулярно линии на нном удалении помещаем надпись с длинной.
Вроде ж просто ? как сделать ?
bdfy вне форума  
 
Непрочитано 26.09.2006, 19:14
#18
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


от теперь все понятно за исключением нного растояния - какое оно должно быть, я предлагаю воспользоваться настройками текущего размерного стиля и выдрать из них расстояние от текста до размерной линии (такая уж привычка - хоть что-то готовенькое использовать)
в любом случае я раньше понедельника этим никак не займусь, так что или подождите или подождите решение от коллег
Zouss вне форума  
 
Автор темы   Непрочитано 26.09.2006, 23:14
#19
bdfy


 
Регистрация: 30.04.2005
Сообщений: 141


Цитата:
нного растояния - какое оно должно быть
к примеру одна третяя от размера текста.
bdfy вне форума  
 
Автор темы   Непрочитано 02.10.2006, 18:27
#20
bdfy


 
Регистрация: 30.04.2005
Сообщений: 141


К слову все еще актуально
2VVA
Как размер шрифта покрутить в вашем лиспе я еще нашел, а вот где точность вывода (т.е число знаков после запятой ) крутнуть ?
bdfy вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как узнать длинну всех выделенных линий ?

Размещение рекламы