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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как упорядочить наложение штриховок,полилиний (Draworder)?

Как упорядочить наложение штриховок,полилиний (Draworder)?

Ответ
Поиск в этой теме
Непрочитано 06.07.2006, 21:57 #1
Как упорядочить наложение штриховок,полилиний (Draworder)?
mmmx
 
Москва
Регистрация: 06.07.2006
Сообщений: 42

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

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

Но есть проблема: иногда такой блок начинает глючить: штриховка у него вдруг перескакивает вперед его линий, например, и блок "слепнет", залитый этой штриховкой. К этим вложенным штриховкам, естественно, мой макрос доступа не имеет.
А также, если в блоке штриховка имеет слой "двери", к примеру, а сам блок находится на слое "0", то и макрос воспринимает его, как слой "0" (не оправдывая мои надежды при его написании )


Если вы сталкивались с такой проблемой, подскажите, как ее решить?
Я уже собрался перебирать и вложенные примитивы, да засомневался, смогу ли я применить к ним команду draworder? Сейчас не помню (программа на работе), как именно я реализовал это... если эта команда работает с селекшенсетом, то это хорошо, но по-моему, я каждый программно выделял, и к выделенному или как к текущему, или как к previous набору применял команду...

В общем, помогите пожалуйста! Если можно, фрагментами кода.
Необязательно на VBA.
Буду очень благодарен,
Михаил
Просмотров: 5254
 
Автор темы   Непрочитано 12.07.2006, 15:00
#2
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Почти доделал!

Технология следующая: нужные примитивы добавляются в ActiveSelectionSet,
к которому потом применяется команда draworder.

Однако такой способ работает с отдельными примитивами,
но не работает с вложенными, элементами блока (пишет "Ключ не найден",
затем "метод ActiveSelectionSet.AddItems failed...")

Что делать???

Код такой:

Код:
[Выделить все]
'Вызываем процедуру orderEntities соответственно количеству слоев раз.
'слой1 - впереди всех, примитивы на нем перекрывают все остальные.
'слой2 - за ним, и так далее...

Sub draw_order()
orderEntities ("Слой3")
orderEntities ("Слой2")
orderEntities ("Слой1")
End Sub



Sub orderEntities(LayerName) ' Имя Слоя as String
  Dim objBlk As AcadBlock
  Dim objAllBlks As AcadBlocks
  Dim objEnt As AcadEntity
  Dim ssobjs(0) As AcadEntity
  
  Set objAllBlks = ThisDrawing.Blocks
  For Each objBlk In objAllBlks
    For Each objEnt In objBlk
    
        'отбираем объекты типа "штриховка", находящиеся на нужном нам слое:
        If objEnt.ObjectName = "AcDbHatch" And objEnt.Layer = LayerName Then
            
                Set ssobjs(0) = objEnt
                ThisDrawing.ActiveSelectionSet.AddItems ssobjs '*** здесь ошибка!***
                ThisDrawing.SendCommand "_draworder" & vbCr & "текущий" & vbCr & vbCr & "е" & vbCr
            
        End If
    Next objEnt
  Next objBlk
End Sub
mmmx вне форума  
 
Непрочитано 12.07.2006, 15:54
#3
Кулик Алексей aka kpblc
Moderator

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


Он и не будет работать со вложенными примитивами - по идее порядок отображения примитивов в блоке (как мне в свое время указал, по-моему, ZZZ) зависит от порядка их создания. То бишь тебе надо внутри блока выбирать все примитивы, кроме растров и штриховок, применять к ним CopyObjects с одинаковыми базовой и конечной точками и удалять исходные.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.07.2006, 16:18
#4
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Я пытался их модифицировать (изменить слой, цвет) - не влияет на порядок следования...

А я правильно понимаю - если делать CopyObjects - объем чертежа растет? Как с этим бороться?
mmmx вне форума  
 
Непрочитано 12.07.2006, 16:34
#5
Кулик Алексей aka kpblc
Moderator

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


Но ты ж сносить должен исходные примитивы... Так что объем не изменится (как я полагаю_)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.07.2006, 17:59
#6
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Кстати, не заметил сразу:

Цитата:
тебе надо внутри блока выбирать все примитивы, кроме растров и штриховок
Почему их-то не надо??? Они друг друга и перекрывают!
mmmx вне форума  
 
Непрочитано 13.07.2006, 08:32
#7
Кулик Алексей aka kpblc
Moderator

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


Стоп. С самого начал. Тебе надо расположить примитивы, входящие в блок, определенным образом, так? Например, самыми нижними идут растры, затем следуют штриховки, потом все остальное. В таком случае тебе по идее надо сделать одно из двух:
- либо выбрать все, кроме того, что попадает "в самый низ", то есть растров, к примеру, скопировать не изменяя точек и удалить исходный; потом повторить для того, что лежит выше штриховок. Или (как вариант) попросту по новой добавить такие примитивы, скопировав свойства.
- либо вручную исправить блоки в библиотеке. Это может оказаться более простым и очевидным, чем что бы то ни было другое.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.07.2006, 10:13
#8
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


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

Вот вариант CopyObjects. Но он почему-то не работает. То есть штриховка копируется (причем автоматом в тот же блок), старая из блока удаляется, но порядок следования не изменяется!

Код:
[Выделить все]
Sub draw_order()
orderEntities ("Слой3")
orderEntities ("Слой2")
orderEntities ("Слой1")
End Sub


Sub orderEntities(LayerName) ' Имя Слоя as String
  Dim objBlk As AcadBlock
  Dim objAllBlks As AcadBlocks
  Dim objEnt As AcadEntity
  Dim ssobjs(0) As AcadEntity
  
  Set objAllBlks = ThisDrawing.Blocks
  For Each objBlk In objAllBlks
    For Each objEnt In objBlk
    
        'отбираем объекты типа "штриховка", находящиеся на нужном нам слое:
        If objEnt.ObjectName = "AcDbHatch" And objEnt.Layer = LayerName Then
            
            
        Dim DOC1 As AcadDocument
        Set DOC1 = ThisDrawing
        Dim copySet(0) As Object
        Set copySet(0) = objEnt
        Dim retObjects As Variant
        retObjects = DOC1.CopyObjects(copySet)
        'objEnt.Delete
            
            
        End If
    Next objEnt
  Next objBlk
End Sub
mmmx вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как упорядочить наложение штриховок,полилиний (Draworder)?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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