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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Невидимые объекты

Невидимые объекты

Ответ
Поиск в этой теме
Непрочитано 15.09.2004, 07:02 #1
Невидимые объекты
Vova
 
Engineer
 
New-York
Регистрация: 05.09.2003
Сообщений: 10,042

Принесли файл, простой текст в модели, типа общие примечания к проекту. На Layout рамка со штампом. Не открывается у них в 2002, хотя им сказали что должен. Размер около 6мег. Ясное дело, перепутали, он открылся в 2004. Пересейвал как 2002. Размер стал 16мег (?!) Далее начал чистить:
1. Purge ничего не дало
2. Вычистил миллион фильтров слоев (в 2004-2004 это можно сделать без специальной проги). Файл похудел всего на неск. мегов, то есть осталось много мусора.
3. Так как слои не отпургивались, возникло смутное подозрение, что там много невидимого. Так и оказалось. Вот метод поиска: Qselect>Entire drawing> Layer. Автокад говорит, что например, 198 Objects selected. Но ни объектов, ни грипсов нет. Смотрю List. А там такое:
POLYLINE Layer: "_KTI_CONTROL"
Space: Model space
Invisible
Handle = 9854
Open space
area 0.00 sq in (0.0000 sq ft)
length 0'-0"
Что значит Invisible? Если нажать Delete или Erase, Объекты удаляются. Так, слой за слоем, можно все вычистить. Но я перенес нужный текст в новый файл, в Layout перенес рамку и новый чертеж потянул нормальные 300кб. Около 50 слоев содержали невидимые и негрипсуемые объекты. Вопрос: Что это за явление и как автоматом все невидимое удалить?
Просмотров: 7296
 
Непрочитано 15.09.2004, 10:51
#2
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Когда то написал для подобного случая:
Код:
[Выделить все]
(defun UnVisible (/ UnvSet cCounter unCounter curEnt vlaEnt)
  (setvar "cmdecho" 0)
  (terpri)
  (Princ "*** Select objects to make unvisible and press [Enter] *** ")
  (terpri)
  (setq UnvSet (ssget))
  (setq cCounter 0)
  (setq unCounter 0)
  (while(/= cCounter (sslength UnvSet))
    (setq curEnt(ssname UnvSet cCounter)
	  vlaEnt(vlax-ename->vla-object curEnt)
	  ); End setq
    (if(vlax-property-available-p vlaEnt 'Visible T)
    (progn
    (vla-put-Visible vlaEnt :vlax-false)
    (setq unCounter(1+ unCounter)
	  cCounter(1+ cCounter)
	  ) ;end setq
    ); end progn
    );end if
    ); end while
    (princ (strcat "*** " (itoa unCounter) " Objects becomes Unvisible *** "))
	   (princ)
	   ); end UnVisible


(defun Visible (/ vSet cCounter unCounter curEnt vlaEnt)
  (setq vSet(ssget "_A"))
  (setq cCounter 0)
  (setq unCounter 0)
	(while(/= cCounter (sslength vSet))
	  (setq curEnt(ssname vSet cCounter)
	  vlaEnt(vlax-ename->vla-object curEnt)
	  ); End setq
    (if(vlax-property-available-p vlaEnt 'Visible T)
    (progn
      (if(=(vla-get-visible vlaEnt) :vlax-false)
	(progn
    (vla-put-Visible vlaEnt :vlax-true)
    (setq unCounter(1+ unCounter))
	  ); end progn
    ); end if
	  (setq cCounter(1+ cCounter))
    ); end progn
	  ); end if
    ); end while
  (terpri)
    (princ (strcat "*** " (itoa unCounter) " Objects becomes Visible *** "))
	(princ)
	 ); end Visible

(defun c:unvis (/ Flag)
  (vl-load-com)
  (initget 1 "V U")
  (setq Flag (getkword "Make objects Unvisible or Visible [U/V]: "))
  (if(= Flag "U")(UnVisible)(Visible))
  (princ)
  ); end c:unvis
Только слои надо разблокировать.
{Smirnoff} вне форума  
 
Непрочитано 15.09.2004, 13:44
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Невидимые - это те, у которых 60 группа DXF равна 1
Кстати, по ней можно делать выбор функцией ssget
vk вне форума  
 
Автор темы   Непрочитано 15.09.2004, 15:08
#4
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,042


VK> Значит ли это что если написать в командной строке (setq A (ssget)) то все, что запомнится под именем "A" можно будет удалить одним махом?
VK, Fantomas и другие программисты> Как образуются невидимые объекты и можно ли в двух словах рассказать что такое 60 группа DXF=1? Как создать невидимый объект искусственно, чтобы поиграться с ним?
Vova вне форума  
 
Непрочитано 15.09.2004, 15:49
#5
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>Vova
Да
Цитата:
Command: (setq a (ssget))
Select objects: Specify opposite corner: 4 found
Select objects: <Selection set: 4>
............
Command: erase
Select objects: !a
<Selection set: 4>
4 found
Select objects:
Command:
Про программки для скрытия/отображения примитивов посмотри здесь http://www.autocad.ru/cgi-bin/f1/board.cgi?t=1739eL и вот здесь http://www.autocad.ru/cgi-bin/f1/board.cgi?t=8121bI
Смысл такой, что если у примитива установлена 60 группа в 1, то примитив просто не виден, хотя он существует в чертеже.
vk вне форума  
 
Непрочитано 15.09.2004, 15:59
#6
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Значит ли это что если написать в командной строке (setq A (ssget)) то все, что запомнится под именем "A" можно будет удалить одним махом?
Просто будут выбраны все объекты включая невидимые конечно можно. Но от select all или erase all это ничем не отличается.

Видимость объектов такое же свойство как цвет, тип линии и т. д. с тем различием что доступно оно только програмно. Поиграться можно очень просто.
(vl-load-com)
(setq a(vlax-ename->vla-object(car(entsel "Select object "))))

(vla-put-Visible a :vlax-false) - сделает объект невидимым
(vla-put-Visible a :vlax-true) - вернет видимость

DXF группа 60 появляется и становиться равной 1, только когда объект невидим. Укажите тот же объект что и в предыдущем примере по запросу (setq b(car(entsel))). Если объект в данный момент виден то (entget b) возвратит список DXF кодов описывающих объект вообще без группы 60, а если вы сделаете его невидимым то увидите там группу (60 . 1).

В вашем случае можно удалить все невидимые объекты на незаблокированных слоях такой функцией:
Код:
[Выделить все]
(defun c:undel (/ vSet cCounter unCounter curEnt vlaEnt) 
  (setq vSet(ssget "_A")) 
  (setq cCounter 0) 
  (setq unCounter 0) 
   (while(/= cCounter (sslength vSet)) 
     (setq curEnt(ssname vSet cCounter) 
     vlaEnt(vlax-ename->vla-object curEnt) 
     ); End setq 
    (if(vlax-property-available-p vlaEnt 'Visible T) 
    (progn 
      (if(=(vla-get-visible vlaEnt) :vlax-false) 
   (progn 
    (vla-Delete vlaEnt)
    (setq unCounter(1+ unCounter)) 
     ); end progn 
    ); end if 
     (setq cCounter(1+ cCounter)) 
    ); end progn 
     ); end if 
    ); end while 
  (terpri) 
    (princ (strcat "*** " (itoa unCounter) " Unvisible objects deleted *** ")) 
   (princ) 
    ); end Visible
Переделал вышенеписанную. Непроверял, но думаю все OK. [/quote]
{Smirnoff} вне форума  
 
Непрочитано 15.09.2004, 16:16
#7
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>Fantomas
Тянет тебя на написание мегабайтов кода. Винчестер наверно безразмерный :wink:
Шутка, конечно.

Все проще
Цитата:
Command: _.erase
Select objects: (ssget "X" '((60 . 1)))
<Selection set: 9>
10 found
Select objects:
Здесь удалено 10 примитивов, которые были невидимы.
vk вне форума  
 
Непрочитано 15.09.2004, 16:20
#8
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>VK [sm204]

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

А дисковое пространство действително девать некуда. 2х120 + директория насерваке. Писать не переписать...
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 15.09.2004, 17:06
#9
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,042


Нарисовал отрезок. Затем:
Цитата:
(vl-load-com)


Command: (setq a (vlax-ename->vla-object (car (entsel "select object"))))
select object#<VLA-OBJECT IAcadLine 0495c354>

Command: (vla-put-visible a :vlx-false)
; error: ActiveX Server returned an error: Parameter not optional
Vova вне форума  
 
Непрочитано 15.09.2004, 17:24
#10
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Command: (vla-put-visible a :vlx-false)
:vlax-false
{Smirnoff} вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Невидимые объекты

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

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