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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Рассчитать длину линий (не суммировать)

Рассчитать длину линий (не суммировать)

Ответ
Поиск в этой теме
Непрочитано 07.02.2009, 13:55 #1
Рассчитать длину линий (не суммировать)
desokol
 
Архитектор
 
Санкт-Петербург
Регистрация: 07.02.2009
Сообщений: 16

Существует несколько линий в пространстве. Необходимо автоматически промаркировать элементы (линии). Данные о них собрать в таблице. Таблица состоит из 2 столбцов: № элемента, длина элемента.

Спасибо.
Просмотров: 6380
 
Непрочитано 07.02.2009, 15:24
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


Поскольку вопрос в разделе "AutoCAD", а версия не озвучена, то, скорее всего, ответ будет: руками. После того, как выяснится, что таблица рисуется AutoCAD'овская, будет добавлено: и полями.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.02.2009, 15:24
#3
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,537
<phrase 1= Отправить сообщение для wetr с помощью Skype™


desokol,
1. Сделай дин. блок - "Линия" с атрибутом "Марка"
2. Нарисуй сколько нужно этих линий-блоков (для удобства можно воспользоваться лиспом)
3. Пронумеруй с помощью лиспа от VVA
3. Извлеки данные из этих блоков в твою таблицу с помощью _dataextraction или VetCAD
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Автор темы   Непрочитано 08.02.2009, 23:29
#4
desokol

Архитектор
 
Регистрация: 07.02.2009
Санкт-Петербург
Сообщений: 16


Проблема в том что эти линии уже нарисованы. Их несколько сотен. Можно ли извлечь данные в таблицу не из блоков, а из линий?
desokol вне форума  
 
Непрочитано 09.02.2009, 00:55
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Распиши подробней, с примерами что есть и что должно полулучиться на выходе, каким образом отмечать линии, в какой последовательности, формат таблицы - програмка сама по себе простая - просто 45 раз ее "доводить" нет ни какого желания.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 09.02.2009, 00:58
#6
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,107


можно
Код:
[Выделить все]
(DeFun c:dlina (/ ss N i len K R)
  (If (SetQ ss (ssget "x"
		      '(
			(-4 . "<OR")
			(0 . "LINE")
			(0 . "ARC")
			(0 . "POLYLINE")
			(0 . "LWPOLYLINE")
			(-4 . "OR>")
		       )
	       )
      )
    (ProgN
      (SetQ N (ssLength ss)
	    i 0
      )
      (While (< i N)
	(SetQ ent (ssName ss i)
	      len (GetObjLength ent)
	      i	  (1+ i)
	      R   (Cons (List i len) R)
	)
      )

      (While R
	(ProgN
	  (SetQ	K (Car R)
		R (Cdr R)
	  )
	  ;; печатаем
	  (Prompt "\n")
	  (Princ (Car K))
	  (Prompt " - ")
	  (Princ (Cadr K))
	)
      )
    )
  )
  (prin1) ;_ BB
)

;;; Возвращает длину объекта
;;; ent - объект
(DeFun GetObjLength	(ent)
  (vlax-curve-getDistAtParam
    (vlax-ename->vla-object ent)
    (vlax-curve-getEndParam ent)
  )
)
только без автокада счас переделал старый код, возможно не будет работать завтро на работе отлажу еси что, а так выложи свой файлик, сподручнее будет. тебе надо маркировать линии в черетеже? и как? а табличку на экран печатать или как?
SetQ вне форума  
 
Автор темы   Непрочитано 09.02.2009, 11:00
#7
desokol

Архитектор
 
Регистрация: 07.02.2009
Санкт-Петербург
Сообщений: 16


Есть:
Некоторое колличество линий в трехмерном пространстве.
Получить на выходе:
1.Пронумеровать линии. Лучше чтобы номера не были разбросаны по всему чертежу, а наблюдалась структура. Например слева направо. Т .е. критерий - читабельность чертежа.
2.Извлечь данные о длине и номере элемента в таблицу. Необходимо чтобы длины элементов коррелировали (соответствовали) с номером элемента.
3. Формат таблицы: Автокадовская либо excel.

SetQ,
К сожалению у меня скрипт не запустился.

Спасибо.
Вложения
Тип файла: dwg 01.DWG (99.1 Кб, 96 просмотров)
desokol вне форума  
 
Непрочитано 09.02.2009, 11:53
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Насчет "читабельности" чертежа - это сильно скзанно, да и слева напрво в трехморном пространстве тоже, если только полуавтоматический вариант - что то типа тыкаешь в линию из него появляеться мультилидер с установленным номером (автоматически увеличивающимся на 1), ты его см распологаешь как угодно и все это фиксируется в таблице.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 09.02.2009, 13:55
#9
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,107


команда dlina:
  1. вставляет в чертёж марки (натуральные числа)
  2. в консоли печатает список марок с длинами
  3. создаёт аналогичный файл data.csv

Код:
[Выделить все]
(DeFun c:dlina (/ ss N i len K R fd line)
  (If (SetQ ss (ssget "x" '((0 . "LINE"))))
    (ProgN
      (SetQ N (ssLength ss)
	    i 0
      )
      (While (< i N)
	(ProgN
	  (SetQ	ent (ssName ss i)
		len (GetObjLength ent)
		i   (1+ i)
		R   (Cons (List i len) R)
	  )
	  (EntMake
	    (List
	      '(0 . "TEXT")
	      (Assoc 10 (EntGet ent))
	      '(40 . 5.0)
	      (Cons 1 (itoa i))
	    )
	  )
	)
      )

      (SetQ
	R  (Reverse R)
	fd (Open (StrCat (GetVar "DWGPREFIX") "data.csv") "w")
      )

      (TextPage)

      (While R
	(ProgN
	  (SetQ	K    (Car R)
		R    (Cdr R)
		line (StrCat (ItoA (Car K)) ";" (RtoS (Cadr K)))
	  )
	  ;; печатаем
	  (Prompt "\n")
	  (Princ (Car K))
	  (Prompt " - ")
	  (Princ (Cadr K))

	  (Write-Line line fd)
	)
      )
      (Close fd)
    )
  )
  (prin1) ;_ BB
)

;;; Возвращает длину объекта
;;; ent - объект
(DeFun GetObjLength (ent)
  (vlax-curve-getDistAtParam
    (vlax-ename->vla-object ent)
    (vlax-curve-getEndParam ent)
  )
)

(Prompt "\nUse 'dlina' command")
(Prin1)
демонстрация того, что это можно сделать
SetQ вне форума  
 
Непрочитано 09.02.2009, 13:57
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


"Полуавтоматический" вариант:
Код:
[Выделить все]
(vl-load-com)
(defun c:test ( / numb tabl obj)
(setq numb (getint "\nВведите число с какого начинать отсчет "))
(while (/= (type tabl) 'vla-object)
(setq tabl (car (entsel "\nУкажите таблицу для записи данных ")))
(if (and tabl (= (cdr (assoc 0 (entget tabl))) "ACAD_TABLE")) (setq tabl (vlax-ename->vla-object tabl)))
);end of while
(while T
(setq obj nil)
(while (not obj)
(setq obj (entsel "\nВыберите линию "))
(if (/= (cdr (assoc 0 (entget (car obj)))) "LINE") (setq obj nil))
);end of while
(command "_mleader" (cadr obj) pause (rtos numb))
(if (> (+ 2 numb) (vla-get-rows tabl)) (vla-insertrows tabl (vla-get-rows tabl) 1 (- (+ 2 numb) (vla-get-rows tabl))))
(vla-settext tabl (+ 1 numb) 0 (rtos numb))
(vla-settext tabl (+ 1 numb) 1 (rtos (distance 	(cdr (assoc 10 (entget (car obj))))
						(cdr (assoc 11 (entget (car obj)))))))
(setq numb (1+ numb))
);end of while
);end of test
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 10.02.2009, 10:08
#11
desokol

Архитектор
 
Регистрация: 07.02.2009
Санкт-Петербург
Сообщений: 16


Дима_,
У меня почему-то не получилось проставить позиции на чертеже. Т. е. не обозначается номер элемента.

SetQ,
Спасибо, все работает отлично. Только не мог бы ты модернизировать код, чтобы номер элемента проставлялся в центр линии. Сейчас он ставится в начало линии. Если в одну точку приходит несколько линий, то номера накладываются один на другой.

Спасибо за помощь.
desokol вне форума  
 
Непрочитано 10.02.2009, 10:42
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от desokol Посмотреть сообщение
У меня почему-то не получилось проставить позиции на чертеже. Т. е. не обозначается номер элемента.
Спасибо за помощь.
Возможно причина в размерном стиле - посмотри номер наверняка есть, но маленький
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 10.02.2009, 20:33
#13
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,107


desokol, легко, две строчки, завтро мож ещё что добавить? а правильно-то считает?
SetQ вне форума  
 
Автор темы   Непрочитано 11.02.2009, 11:04
#14
desokol

Архитектор
 
Регистрация: 07.02.2009
Санкт-Петербург
Сообщений: 16


SetQ, считает правильно. Меня все устраивает. Так что жду от тебя ответа.

Спасибо.
desokol вне форума  
 
Непрочитано 11.02.2009, 11:39
#15
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,107


рилайз от сегодня:
  • ставит марки в середине отрезков
  • разделитель разрядов - запятая
  • имя .csv файла - это имя чертежа + расширение .csv

Код:
[Выделить все]
;;; Маркирует все отрезки, считает длину, выводит на экран и в файл
;;; последняя правка - 11/02 2009 by SetQ

(DeFun c:dlina (/ ss N i K R ent lst p0 p1 p2 len len2 fd line)
  (If (SetQ ss (ssget "x" '((0 . "LINE"))))
    (ProgN
      (SetQ N (ssLength ss)
	    i 0
      )

      (While (< i N)
	(ProgN
	  (SetQ	ent  (ssName ss i)
		len  (GetObjLength ent)
		i    (1+ i)
		R    (Cons (List i len) R)
		lst  (EntGet ent)
		p0   (Cdr (Assoc 10 lst))
		p1   (Cdr (Assoc 11 lst))
		len2 (/ (Distance (List (Car p0) (Cadr p0)) p1) 2.0)
		p2   (Polar p0 (Angle p0 p1) len2)
	  )

	  (EntMake
	    (List
	      '(0 . "TEXT")
	      (Cons 10 p2)
	      '(40 . 5.0)		; 5.0 - высота текста
	      (Cons 1 (itoa i))
	    )
	  )
	)
      )

      (SetQ
	R  (Reverse R)
	fd (Open (StrCat (GetVar "DWGPREFIX") (GetVar "DWGNAME") ".csv")
		 "w"
	   )
      )

      (TextPage)

      (While R
	(ProgN
	  (SetQ	K    (Car R)
		R    (Cdr R)
		line (vl-string-subst
		       ","
		       "."
		       (StrCat (ItoA (Car K)) ";" (RtoS (Cadr K)))
		     )
	  )
	  ;; печатаем
	  (Write-Line line fd)
	  (Prompt (StrCat "\n" (vl-string-subst " - " ";" line)))
	)
      )
      (Close fd)
    )
  )
  (prin1) ;_ BB
)

;;; Возвращает длину объекта
;;; ent - объект
(DeFun GetObjLength (ent)
  (vlax-curve-getDistAtParam
    (vlax-ename->vla-object ent)
    (vlax-curve-getEndParam ent)
  )
)

(Prompt "\nUse 'dlina' command")
(Prin1)
SetQ вне форума  
 
Автор темы   Непрочитано 11.02.2009, 13:00
#16
desokol

Архитектор
 
Регистрация: 07.02.2009
Санкт-Петербург
Сообщений: 16


SetQ
Возможно ли сделать точную привязку текста к центру линии?
У меня некоторые номера сдвинулись по оси Z.
desokol вне форума  
 
Непрочитано 11.02.2009, 13:19
#17
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,107


это как - middle у текста? чот не понял про Z, выложи примерчик - как есть и как надо.

по Z что-ли чтобы на нуле лежали?
SetQ вне форума  
 
Автор темы   Непрочитано 11.02.2009, 13:27
#18
desokol

Архитектор
 
Регистрация: 07.02.2009
Санкт-Петербург
Сообщений: 16


Линия находится в трехмерном пространстве. Запускаю код. Получается, что текст по оси Z лежит не в центре линии. Т. е. координата Z у текста привязана не к центру линии, а видимо к точке p0 или p1.

Если не понятно, то пример отправлю.
desokol вне форума  
 
Автор темы   Непрочитано 11.02.2009, 13:34
#19
desokol

Архитектор
 
Регистрация: 07.02.2009
Санкт-Петербург
Сообщений: 16


Врт что получилось.
Вложения
Тип файла: dwg
DWG 2007
02.dwg (44.8 Кб, 1286 просмотров)
desokol вне форума  
 
Непрочитано 11.02.2009, 19:16
#20
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,107


Код:
[Выделить все]
;;; Маркирует все отрезки, считает длину, выводит на экран и в файл.
;;; Марки расставляет в середины 3d-отрезков
;;; последняя правка - 11/02 2009 by SetQ

(DeFun c:dlina (/ ss N i K R ent lst p0 p1 p2 len len2 fd line)
  (If (SetQ ss (ssget "x" '((0 . "LINE"))))
    (ProgN
      (SetQ N (ssLength ss)
	    i 0
      )

      (While (< i N)
	(ProgN
	  (SetQ	ent (ssName ss i)
		len (GetObjLength ent)
		i   (1+ i)
		R   (Cons (List i len) R)
		lst (EntGet ent)
		p0  (Cdr (Assoc 10 lst))
		p1  (Cdr (Assoc 11 lst))
		p2  (List
		      (simple_average (Car p0) (Car p1))
		      (simple_average (Cadr p0) (Cadr p1))
		      (simple_average (Caddr p0) (Caddr p1))
		    )
	  )

	  ;; вставляем в чертеж марку
	  (EntMake
	    (List
	      '(0 . "TEXT")
	      (Cons 10 p2)		; точка вставки
	      '(40 . 5.0)		; 5.0 - высота текста
	      (Cons 1 (itoa i))		; сам текст
	    )
	  )
	)
      )

      (SetQ
	R  (Reverse R)
	fd (Open (StrCat (GetVar "DWGPREFIX") (GetVar "DWGNAME") ".csv")
		 "w"
	   )
      )

      ;; открывает окно консоли - аналогично F2, если не нужно - моно убрать
      (TextPage)

      (While R
	(ProgN
	  (SetQ	K    (Car R)
		R    (Cdr R)
		line (vl-string-subst
		       ","
		       "."
		       (StrCat (ItoA (Car K)) ";" (RtoS (Cadr K)))
		     )
	  )
	  ;; печатаем
	  (Write-Line line fd)		; в файл
	  (Prompt			; на экран
	    (StrCat "\n" (vl-string-subst " - " ";" line))
	  )
	)
      )
      (Close fd)
    )
    (Alert "Нет ни одной линии в чертеже.")
  )
  (prin1) ;_ BB
)

;;; Возвращает длину объекта
;;; ent - объект
(DeFun GetObjLength (ent)
  (vlax-curve-getDistAtParam
    (vlax-ename->vla-object ent)
    (vlax-curve-getEndParam ent)
  )
)

;;; среднее арифметическое
(DeFun simple_average (a b) (/ (+ a b) 2.0))

(Prompt "\nUse 'dlina' command")
(Prin1)
так? высота текста только жестко в проге задана, она постоянная?
SetQ вне форума  
 
Автор темы   Непрочитано 12.02.2009, 12:52
#21
desokol

Архитектор
 
Регистрация: 07.02.2009
Санкт-Петербург
Сообщений: 16


SetQ
Спасибо тебе большое! Все работает как надо.
Очень
desokol вне форума  
 
Непрочитано 12.02.2009, 19:48
#22
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,107


desokol, на здоровье!
SetQ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Рассчитать длину линий (не суммировать)

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить длину множества линий одним разом iDemon AutoCAD 12 27.11.2008 14:04
Близко расположенные линии в чертеже сливаются. Wowik53 AutoCAD 50 01.11.2008 21:40
Как в автокаде получить общую длину нескольких линий сразу. Рин AutoCAD 1 14.04.2008 11:57
Как рассчитать стыки (в стыках) и длину сварки (в м.)? ACAD Прочее. Архитектура и строительство 11 19.12.2007 17:58
Как рассчитать длину сварного шва? Бохан Евгений Прочее. Архитектура и строительство 6 22.08.2007 11:35