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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с написанием програмки по автоматическому созданию слоёв

Помогите с написанием програмки по автоматическому созданию слоёв

Ответ
Поиск в этой теме
Непрочитано 27.09.2010, 14:51 #1
Помогите с написанием програмки по автоматическому созданию слоёв
Андрей Будзинский
 
Регистрация: 01.12.2009
Сообщений: 62

Добрый день!
Помогите пожалуйста написать програмку, которая делала бы следующее:
-создать количество слоёв, равное количеству описаний блоков
- присвоить каждому слою имя как имя блока
- скопировать по одному блоку на слой, который имеет такое же имя, что и имя блока
Так, например, в примере создалось бы 3 слоя: Блок-1, Блок-2 и Блок-3.
Ну и скопировать по одному блоку в соответствующий слой.
Заранее большое спасибо!
Просмотров: 6284
 
Непрочитано 27.09.2010, 15:15
#2
Дима_

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


Код:
[Выделить все]
(vl-load-com)
(defun c:block-to-layer ()
(mapcar '(lambda (block)
	((lambda (lst)
		(entmod (subst	(cons 8 (vla-get-effectivename (vlax-ename->vla-object block)))
						(assoc 8 lst)
						lst)))
(entget block)))
(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_a"(list (cons 0 "insert")))))))
(princ))
запускать block-to-layer
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 27.09.2010, 15:42
#3
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Дима_, у Вас можно учиться искусству программирования на лиспе, только вот у меня вопрос. Конструкция (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_a"(list (cons 0 "insert")))))) вернет только все вхождения блоков, а не описания. А Андрей Будзинский вроде просил:
Цитата:
создать количество слоёв, равное количеству описаний блоков
может я не прав?
TararykovDG вне форума  
 
Автор темы   Непрочитано 27.09.2010, 16:33
#4
Андрей Будзинский


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


Спасибо что откликнулись!
TararykovDG, Вы абсолютно правы. Необходимо на созданные слои поместить лишь одно описание блока (или одну копию блока).
Дима_, Вам большое спасибо, что откликнулись. Но я немного нечётко сформулировал задачу. Вобщем, нужно чтобы существующие блоки не перекидывались на новые слои, а лишь копировался один из блоков на слой с соответствующим именем. Можно даже не блок, а объекты, входящие в описание блока. Так после выполнения лиспа для приведённого примера, на 0 слое осталось всё без изменения, а на новые слои скопировалось по одному блоку (на слой Блок 1 - 1 блок с именем Блок-1 и т.д.). Если несложно, подмодифицируйте код, чтобы он выполнял эту задачу. Большое спасибо!
Андрей Будзинский вне форума  
 
Непрочитано 27.09.2010, 16:44
#5
VVA

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


Модифицированный вариант команды от Димы_. Не оптимально, но зато быстро

Код:
[Выделить все]
(vl-load-com)
(defun C:BTL () (c:block-to-layer))
(defun c:block-to-layer (/ laylist)
;;;command block-to-layer
  (mapcar
    '(lambda (block / lst)
       (if (not (vl-position
                  (get-block-name (vlax-ename->vla-object block))
                  laylist
                ) ;_ end of VL-POSITION
           ) ;_ end of not
         (progn
           (entmod
             (subst
               (cons
                 8
                 (car (setq
                        laylist (cons (get-block-name
                                        (vlax-ename->vla-object block)
                                      ) ;_ end of get-block-name
                                      laylist
                                ) ;_ end of cons
                      ) ;_ end of setq
                 ) ;_ end of car
               ) ;_ end of cons
               (assoc 8
                      (setq
                        lst (entget
                              (vlax-vla-object->ename
                                (vla-copy (vlax-ename->vla-object block))
                              ) ;_ end of vlax-vla-object->ename
                            ) ;_ end of entget
                      ) ;_ end of setq
               ) ;_ end of assoc
               lst
             ) ;_ end of subst
           ) ;_ end of entmod
         ) ;_ end of progn
       ) ;_ end of if
     ) ;_ end of lambda
    (vl-remove-if
      'listp
      (mapcar 'cadr
              (ssnamex (ssget "_a" (list (cons 0 "insert"))))
      ) ;_ end of mapcar
    ) ;_ end of vl-remove-if
  ) ;_ end of mapcar
  (princ)
) ;_ end of defun
(defun get-block-name (itm)
  (cond
    ((and (vlax-property-available-p itm 'isdynamicblock)
          (= (vla-get-isdynamicblock itm) :vlax-true)
     ) ;_ end of and 
     (vla-get-effectivename itm)
    )

    (t (vla-get-name itm))
  ) ;_ end of cond
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 27.09.2010 в 18:03.
VVA вне форума  
 
Непрочитано 27.09.2010, 16:47
#6
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Андрей Будзинский Посмотреть сообщение
Необходимо на созданные слои поместить лишь одно описание блока (или одну копию блока).
Описание блока и копия (правильнее - "вхождение блока") - это разные вещи. Не путайте мягкое с тёплым.
Offtop: Курсовая работа?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 27.09.2010, 16:55
#7
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Но я немного нечётко сформулировал задачу
Андрей Будзинский, на самом деле вопросов стало только больше.
Цитата:
скопировалось по одному блоку
а если у вашего блока были атрибуты и в каждом из его вхождений со своими значениями, то что копировать в значения атрибутов на блок в новом слое?
и еще, как сказал hwd скопировать надо вхождение блока или описание? В чертеже может быть описано несколько блоков, например Блок1, Блок2, ..., Блок10, а вставлены в чертеж только Блок1 и Блок2, причем несколько раз, это вхождения блоков, так вот программы Дима_ и VVA создадут слои Блок1 и Блок2. Далее у Дима_ все вхождения блоков Блок1 и Блок2 перейдут соответственно на слои Блок1 и Блок2, а у VVA на слои Блок1 и Блок2 будут скопированы по одному вхождению блоков Блок1 и Блок2. Но вот блоки Блок3...Блок10 останутся без внимания и соответствующих слоев не появиться.
А как нужно Вам, так и осталось вопросом?

Последний раз редактировалось TararykovDG, 27.09.2010 в 19:17.
TararykovDG вне форума  
 
Непрочитано 27.09.2010, 21:00
#8
Кулик Алексей aka kpblc
Moderator

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


Не, ребята, вопросов еще больше
А что делать с вложенными блоками? А как обрабатывать внешние ссылки? И все-таки: копировать или перемещать блоки (принимая, что значения и настройки атрибутов должны быть продублированы)?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.09.2010, 21:08
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Засечки/стрелки у размеров/выносок - тоже проставляются вхождениями блоков. Под засечки/стрелки так же требуется отдельный слой?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 27.09.2010, 21:18
#10
Кулик Алексей aka kpblc
Moderator

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


Ну вот, Андрей, такой облом спалил
Автору: чем точнее техзадание, тем быстрее и точнее будет решение
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.09.2010, 22:06
#11
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


А может быть автор ветки забыл про слой 0 и свойства примитивов блока ByBlock.....
Что-то задача подозрительная, навевает мысли...
ShaggyDoc вне форума  
 
Непрочитано 27.09.2010, 22:47
#12
Дима_

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


Да - видимо я поторопился - автору - поделитесь конечной задачей, может "ясность" появиться?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.09.2010, 13:33
#13
Андрей Будзинский


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


Спасибо огромное!
Код Димы подправленный VVA полностью решил задачу. Ну и хочу внести ясность, зачем мне всё это понадобилось.
Значит есть модель, содержащая много описаний блоков с разными количествами вхождений. Большинство документов подготавливалось именно с использованием всей модели. Но в конце нужно было сделать чертёжик, где указаны размеры каждого описания блока. Более того, для наглядности каждый нужно было расположить в нескольких ВЭ. Поместить в ВЭ только описание блока похоже невозможно. Поэтому эту задачу можно решить, управляя видимостью слоя в ВЭ. Создавать слои и копировать на них блоки вручную - довольно тяжёлая задача. Вот поэтому и решил обратиться за помощью.
Ещё раз большое спасибо!
Андрей Будзинский вне форума  
 
Непрочитано 29.09.2010, 13:52
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Андрей Будзинский Посмотреть сообщение
где указаны размеры каждого описания блока. Более того, для наглядности каждый нужно было расположить в нескольких ВЭ. Поместить в ВЭ только описание блока похоже невозможно.
Похоже, что вы не понимаете, что такое описание (правильнее - определение) блока, а что такое вхождение блока.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 29.09.2010, 15:20
#15
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Поэтому эту задачу можно решить, управляя видимостью слоя в ВЭ.
Мои подозрения оправдываются. Для этого не надо создавать множество описаний блоков. Можно иметь один правильный блок, и вставлять его на множество, возможно, действительно необходимых слоев.

"Правильный" блок это:

1. Блок, у которого все примитивы находятся на слое "0".
2. Все примитивы блока имеют свойства "ByBlock" (некоторые, возможно - ByLayer). Некоторые, возможно, "кокретный цвет". Главное - слой "0".

"Правильный" блок, при вставке на любой слой наследует свойства текущего (в момент вставки) слоя.

Т.е. примитивы правильного блока будут как бы размещены на этом слое.

Если, например, для видового экрана будет заморожен какой-то слой, то будут невидимы и все правильные блоки. Но правильные блоки, вставленные в видимые слои, останутся видимыми.

Плодить описаний блокв не нужно! Не нужны и "программки".
ShaggyDoc вне форума  
 
Непрочитано 29.09.2010, 15:50
#16
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
"Правильный" блок это:
1. Блок, у которого все примитивы находятся на слое "0".
ShaggyDoc, прошу прощения, но у меня вопрос по "правильным блокам". Для отображения точек тахеометрической съемки (ж/д путей и полосы отвода) я создал такой блок:
окружность - для отображения самой точки;
атрибут1 - высотная отметка точки;
атрибут2 - код точки; (например: "R" - рельефная точка; "1" - точка 1-го пути; "BR" - бровка и т. д.)
атрибут3 - порядковый номер точки;

при отрисовки плана съемки необходимо видеть все атрибуты, а вот для печати атрибут2 и атрибут3 необходимо убрать. Для этого я в определении блока разнес все атрибуты по своим слоям, теперь отключая и включая слои я могу когда мне убирать и снова отображать атрибут2 и атрибут3, назначать им разные цвета задавая цвет слою. Чем же этот блок "неправильный"?
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 29.09.2010, 15:58
#17
Кулик Алексей aka kpblc
Moderator

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


А не проще ли было поместить атрибуты на непечатаемый слой?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.09.2010, 16:13
#18
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Кулик Алексей aka kpblc, дело не только в печати. При работе с чертежем то нужны, то не нужны некоторые атрибуты. Изыскатели привезли съемку и рисуют план. Куча точек, надо нарисовать здания, откосы (провести линии бровки и подошвы) и ещё ... Нужны коды и номера точек. Потом чертеж взяли проектировщики, надо им посмотреть на горизонтали или на какую-нибудь трубы или еще что-то, им нужны только высотные отметки, теперь коды и номера только захломляют чертеж их надо убрать. Потом изыкатели вспомнили что еще не нанесли какой-нибудь кабель, снова нужны коды и номера и так не один раз и только потом печать чертежа без кодов и номеров? И как мне быть?
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 29.09.2010, 18:40
#19
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
я создал такой блок:
Надо создавать не собственное условное изображение, а использовать стандартное. В "Условных знаках..." имеются различные знаки для отображения точек сетей - номера с 1 по 12. Там имеется даже до 4-х атрибутов. И вся страна много десятилетий пользуется. И проектировщики прекрасно знают, как рационально использовать топографическую подоснову. А как же они работали на бумаге, когда вообще ничего нельзя было "отключить"?

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

При грамотной организации работ посмотреть "полную" подоснову всегда можно.
ShaggyDoc вне форума  
 
Непрочитано 29.09.2010, 19:32
#20
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
В "Условных знаках..." имеются различные знаки для отображения точек сетей - номера с 1 по 12. Там имеется даже до 4-х атрибутов.
Если есть атрибуты, значит речь идет о программной реализации некой библиотеки "Условных знаков". У меня от руководства есть "голый" ACAD 2008 и все надстройки самодельное творчество. Если же эти "Условные знаки" есть в свободном доступе, то не сочтите за труд дать ссылку, я хоть поучусь как надо делать.

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
И проектировщики прекрасно знают, как рационально использовать топографическую подоснову.
не хочу никого обидеть, но это не про наших проектировщиков

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
При грамотной организации работ посмотреть "полную" подоснову всегда можно.
Я к сожалению, а может наоборот, к счастью, не руководитель фирмы, а программист и ни как не могу повлиять на грамотную организацию работы.
__________________
cadtools
TararykovDG вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с написанием програмки по автоматическому созданию слоёв



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Полы по грунту в жилом доме - помогите выбрать состав слоёв Минька Конструкции зданий и сооружений 17 06.08.2009 08:18
Профи помогите найти профессиональную програму по созданию.. toXic1 Прочее. Программное обеспечение 4 07.12.2005 12:37