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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Опять о координате Z. Программа перебирающая все примитивы с Z<>0.

Опять о координате Z. Программа перебирающая все примитивы с Z<>0.

Ответ
Поиск в этой теме
Непрочитано 19.04.2013, 18:01 #1
Опять о координате Z. Программа перебирающая все примитивы с Z<>0.
Sysvju
 
проектант
 
Регистрация: 12.12.2012
Сообщений: 126

Работаю с AutoCAD Mechanical, пробовал большинство программ для "сплющивания" чертежей, но результат все равно оставляет желать лучшего. Большинство программ, ссылки на которых указаны на форуме просто зависают или изменяют примитивы, особенно касается полилиний и радиусов.

Поэтому и возник вопрос. Может быть кто сталкивался или видел где программку на лиспе, которая работала бы по методу "Quick Select", где можно выбрать все примитивы чертежа (линии, полилинии, окружности и etc.), для которых Z не равна 0. А затем автомотически происходило замещение, например для линий Start Z, End Z на 0.

Буду признателен за любую помощь.
Просмотров: 16295
 
Непрочитано 19.04.2013, 18:27
#2
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


похоже, либо вы не до конца понимаете задачу, либо не очень верно ее формулируете...

Для линий:
Если линия находится на некоторой высоте, то обнуление высоты автоматом опустит ее на плоскость XY
Линия не может быть отрисована в системе координат, отличной от мировой, те. может, но при обнулении высоты в панели свойств, концы линии опускаются в мировой системе.

Для полилиний, например lwpolyline:
Линия нарисована на плоскости, т.е пара сегментов не лежащих на одной линии уже определяют эту плоскость. Плоскость отрисовки полилинии задается вектором нормали (вектор, перпендикулярный плоскости полилинии) и этот вектор может не совпадать с плоскостью XY мировой системы координат.
Если полилиния лежит на плоскости параллельной XY, то смена высоты опустит ее так, как вам необходимо.
Если же полилиния лежит в не параллельной XY плоскости, то опускаться она будет по вектору нормали, т.е на виде сверху, полилиния уедет в сторону.
Программы сплющивания полилиний пересчитывают все сегменты на предмет опускания их вдоль вектора Z мировой системы координат. Другими словами получается не перемещение полилинии а именно проекция на плоскость.
Если в полилинии присутствуют дуговые сегменты, то на не параллельной проекции должны появиться эллипсы. Но описание полилинии не поддерживает эллипсы как сегменты, т.е получается разбитие полилиний на линии и эллипсы.
Если вектор проекции не перпендикулярен, даже в 16 знаке после запятой, то дуги должны быть преобразованы в эллипсы!

ps. но это только в теории, на практике все программы делались под определенные задачи и совсем не обязательно, что они предусматривают ваш вариант. Будьте более снисходительны к программистам и программам. Надеюсь, мое пояснение поможет вам найти наиболее оптимальный для вас вариант...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 19.04.2013, 19:21
#3
Sysvju

проектант
 
Регистрация: 12.12.2012
Сообщений: 126


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
похоже, либо вы не до конца понимаете задачу, либо не очень верно ее формулируете...
может быть и так.
Для удаления смещения по Z я делаю следующее, например для линий (с полилиниями я может и погорячился):
1. при помощи "Quick Select" выбираю линии, где delta Z не равна 0, затем в выбранных линиях в свойствах меняю Start Z, End Z на 0.
2. аналогично п. 1 только для start Z > 0
3. аналогично п. 1 только для start Z < 0

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

Несмотря, та то что м.б. и затратно по времени, зато надежно и просто.

Вот такая у меня идея. может кто знает как реализовать?
Sysvju вне форума  
 
Непрочитано 19.04.2013, 22:20
#4
swell{d}

гадание на конечно-элементной гуще
 
Регистрация: 31.05.2006
Düsseldorf
Сообщений: 7,604


http://fordewind.org/wiki/doku.php?i...82%D1%91%D0%B6
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 19.04.2013, 23:00
#5
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Елпанов Евгений
Цитата:
Линия не может быть отрисована в системе координат, отличной от мировой
С линиями тоже не всё так просто - у них нет системы координат объекта, но вектор нормали присутствует - обнуление Thickness может исказить чертеж в плоскости X-Y
zamtmn вне форума  
 
Непрочитано 20.04.2013, 00:13
#6
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
С линиями тоже не всё так просто
Спасибо за поправку.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 22.04.2013, 11:53
#7
Sysvju

проектант
 
Регистрация: 12.12.2012
Сообщений: 126


Цитата:
Сообщение от swell{d} Посмотреть сообщение
http://fordewind.org/wiki/doku.php?i...82%D1%91%D0%B6
Спасибо за подсказку, а только возникают сложности с запуском этого скрипта. Можете подсказать, как его запустить?
Sysvju вне форума  
 
Непрочитано 22.04.2013, 12:10
#8
swell{d}

гадание на конечно-элементной гуще
 
Регистрация: 31.05.2006
Düsseldorf
Сообщений: 7,604


Sysvju, скрипт написан (и работает) для нанокада.
Теоретически, без особых танцев, должен запуститься и под автокадом, но у меня он не установлен и проверить возможности нет.
Вам нужен кто-то с автокадом, кто разбирается в VBA, кто мог бы проверить и при необходимости, "допилить".
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 22.04.2013, 12:50
#9
PsixVK


 
Регистрация: 19.10.2012
Киев
Сообщений: 749


интересно посмотреть чертеж который зависает при обнулении
PsixVK вне форума  
 
Непрочитано 22.04.2013, 14:35
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Sysvju Посмотреть сообщение
может быть и так.
Для удаления смещения по Z я делаю следующее, например для линий (с полилиниями я может и погорячился):
1. при помощи "Quick Select" выбираю линии, где delta Z не равна 0, затем в выбранных линиях в свойствах меняю Start Z, End Z на 0.
2. аналогично п. 1 только для start Z > 0
3. аналогично п. 1 только для start Z < 0

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

Несмотря, та то что м.б. и затратно по времени, зато надежно и просто.

Вот такая у меня идея. может кто знает как реализовать?
Пример лиспа на коленке. Проверил один раз на файле с 20000 линий - время работы около секунды, без точного замера.

Код:
[Выделить все]
 (defun c:z0 (/ E EN I P1 P2 S)
  ;; Обнуление высоты всех линий, кроме находящихся на заблокированных слоях.
  (if (setq i 0
            s (ssget "_x" '((0 . "line")))
      )
    (while (setq e (ssname s i))
      (setq en (entget e)
            p1 (assoc 10 en)
            p2 (assoc 11 en)
            i  (1+ i)
      )
      (entmod (subst (list 11 (cadr p2) (caddr p2) 0) p2 (subst (list 10 (cadr p1) (caddr p1) 0) p1 en)))
      (entupd e)
    )
  )
  (princ)
)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 22.04.2013, 14:46
#11
Sysvju

проектант
 
Регистрация: 12.12.2012
Сообщений: 126


Цитата:
Сообщение от PsixVK Посмотреть сообщение
интересно посмотреть чертеж который зависает при обнулении
Мне тоже было бы интересно услышать стороннее мнение, но к сожалению у нас, строго запрещено передавать информацию третьим лицам.
Посути дела на чертеже есть объекты экспортированные из advance steel в механикал может быть в этом проблема. Но не в этом суть, главное, что нужен лисп, работающий по примитивному алгоритму см. #3, может есть умельцы?

Пока на обед ходил, уже лисп написали. СПАСИБО, сейчас проверю.
Sysvju вне форума  
 
Непрочитано 22.04.2013, 14:53
#12
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Sysvju Посмотреть сообщение
1. при помощи "Quick Select" выбираю линии, где delta Z не равна 0, затем в выбранных линиях в свойствах меняю Start Z, End Z на 0.
2. аналогично п. 1 только для start Z > 0
3. аналогично п. 1 только для start Z < 0
А зачем производить эти действия для отдельно взятых линий? Можно же выбрать вообще все линии и ровнять сразу все, включая те, которые уже на нулевой высоте...
С точки зрения результата, никакой разницы!
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 22.04.2013, 15:27
#13
Sysvju

проектант
 
Регистрация: 12.12.2012
Сообщений: 126


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
С точки зрения результата, никакой разницы!
При программировании Вы правы, но если выделять ручками при помощи "Quick Select" то нужен аттрибут одинаковый для всех линий, который я не вижу.

Программа работает супер, то что и хотелось (подвисает всего на 5-7 секунд, что по сравнению с другими методами ооочень быстро).
Поэтому Вам большое человеческое СПАСИБО!
Не сочтите за наглость, можете ли дополнить программу, что бы она нереносила еще и координату блоков (Position Z) и окружностей (Center Z) в ноль.

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

Последний раз редактировалось Sysvju, 22.04.2013 в 16:42.
Sysvju вне форума  
 
Непрочитано 22.04.2013, 15:50
#14
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Sysvju Посмотреть сообщение
При программировании Вы правы, но если выделять ручками при помощи "Quick Select" то нужен аттрибут одинаковый для всех линий, который я не вижу.
Этот атрибут называется тип объектов...
Миниатюры
Нажмите на изображение для увеличения
Название: t1.PNG
Просмотров: 67
Размер:	20.9 Кб
ID:	101647  Нажмите на изображение для увеличения
Название: t2.PNG
Просмотров: 64
Размер:	25.1 Кб
ID:	101648  
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 22.04.2013, 16:02
#15
Sysvju

проектант
 
Регистрация: 12.12.2012
Сообщений: 126


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Этот атрибут называется тип объектов...
я образно выразился, но имел в виду все-таки "свойства"/"Properties", которые разные для всех линий, а вообще хорошая идея...Даже лисп не понадобиться, если выбирать линии по непринадлежности к одному слою.
Sysvju вне форума  
 
Непрочитано 22.04.2013, 16:45
#16
PsixVK


 
Регистрация: 19.10.2012
Киев
Сообщений: 749


можно еще:
ctrl+A и в свойствах перебрать все объекты сбить все Z и уровни на ноль
PsixVK вне форума  
 
Автор темы   Непрочитано 22.04.2013, 17:01
#17
Sysvju

проектант
 
Регистрация: 12.12.2012
Сообщений: 126


Цитата:
Сообщение от PsixVK Посмотреть сообщение
можно еще:
ctrl+A и в свойствах перебрать все объекты сбить все Z и уровни на ноль
Точно! Спасибо. Все получилось, только если меняю у блоков (Position Z) на ноль, после того как нажму энтер возвращается *Variaes*.

Ну и естественно линии в блоках остаются со смещением по Z! Тут наверное как раз и нужен ЛИСП?

Последний раз редактировалось Sysvju, 22.04.2013 в 17:03. Причина: дополнение
Sysvju вне форума  
 
Непрочитано 22.04.2013, 17:06
#18
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


да, здесь лисп поможет, но стоит сразу напомнить - внутри блоков линии опустятся на нулевую высоту внутри блока, а как эта плоскость расположена относительно мировой системы координат, это уже дело проектировщика...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 22.04.2013, 17:11
#19
Sysvju

проектант
 
Регистрация: 12.12.2012
Сообщений: 126


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
да, здесь лисп поможет, но стоит сразу напомнить - внутри блоков линии опустятся на нулевую высоту внутри блока, а как эта плоскость расположена относительно мировой системы координат, это уже дело проектировщика...
В чертежах, с которыми я работаю, блоки, а соответственно и линии в них параллельны XY. Если какая-либо второстепенная линия и будет неправильно спроецированна, на мою работу это никак не повлияет. К тому же удобство ЛИСПа - запустил комманду и пошел попил чаю, пришел, а уже все сделано как надо. Заранее спасибо!
Sysvju вне форума  
 
Непрочитано 22.04.2013, 17:33
1 | #20
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Код:
[Выделить все]
 (defun c:z0b (/ f)
  ;; Обнуление высоты начальной и конечной точек линий, внутри всех блоков.
  ;; Изменение высоты производится в системе координат блока.
  ;; Линии, лежащие на заблокированном слое, будут проигнорированы.
  (vl-load-com)
  (defun f (p)
    (vlax-3d-point
      (reverse
	(cons 0.0
	      (cdr (reverse (vlax-safearray->list
			      (vlax-variant-value p)
			    )
		   )
	      )
	)
      )
    )
  )
  (vlax-for b (vla-get-Blocks
		(vla-get-ActiveDocument (vlax-get-acad-object))
	      )
    (vlax-for o	b
      (if (= (vla-get-ObjectName o) "AcDbLine")
	(progn
	  (vla-put-StartPoint o (f (vla-get-StartPoint o)))
	  (vla-put-EndPoint o (f (vla-get-EndPoint o)))
	)
      )
    )
  )
  (princ)
)
ps. Стоит заметить, что пространство модели и пространство листов, это для AutoCAD тоже блоки. Другими словами, данная программа обнуляет высоту начальной и конечной точек вообще всех имеющихся линий, если они не лежат на заблокированных слоях. Программу не тестировал...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 22.04.2013 в 18:06. Причина: добавил комментарии
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Опять о координате Z. Программа перебирающая все примитивы с Z<>0.

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Фундамент с динамическими нагрузками в Scad Tlelaxu SCAD 9 31.08.2007 10:44