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

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

Оптимизация таблиц

Ответ
Поиск в этой теме
Непрочитано 27.08.2009, 13:55 #1
Оптимизация таблиц
acyxou
 
Регистрация: 12.07.2008
Сообщений: 211

Долго искал по форумам и не смог найти програмку...
Нужен инструмент для оптимизации автокадовских таблиц.
Оптимизировать пока необходимо только высоту ячейки (строки). Она должна быть кратна 8 миллиметрам. Т.е. если в ячейке одна строка с текстом, то высота ячейки должна быть 8мм. Если две строки - то 16мм... и т.д.
Полагаю, что программулина должна просматривать все ячейки выбранной таблицы с Row Style = Data и изменять высоту строки в соответствии с ячейкой, в которой находится максимальное количество текстовых строк. При этом она не должна изменять ширину столбцов.
Как думаете, реально такое?
Заранее благодарен
__________________
Users are not stupid, they are busy.
Просмотров: 7266
 
Непрочитано 27.08.2009, 13:59
#2
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Такого никто не делал, насколько я знаю. Есть atable но сейчас он не поддерживается, соответственно на него садиться не айс, также я бы не рекомендовал использовать автокадовский объект таблица, с ним проблем больше чем пользы.
Sleekka вне форума  
 
Автор темы   Непрочитано 27.08.2009, 14:04
#3
acyxou


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


Цитата:
с ним проблем больше чем пользы.
Попрошу аргументировать, милейший!
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 27.08.2009, 14:13
#4
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Sleekka

CAD-manager

Москва
Регистрация: 24.07.2005
Сообщений: 1,007
Извините на другие аргументы у меня времени нет.
Sleekka вне форума  
 
Непрочитано 27.08.2009, 14:20
#5
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


Цитата:
Сообщение от Sleekka Посмотреть сообщение
Извините на другие аргументы у меня времени нет.
а жаль, мне б тоже хотелось бы услышать
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 27.08.2009, 14:21
#6
Кулик Алексей aka kpblc
Moderator

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


Во-первых, atable поддерживается и работает в версиях вплоть до 2010. то, что сайт начальный переехал - еще ничего не значит. Я atable не пользуюсь - как-то не до того
Во-вторых, в подавляющем большинстве случаев AutoCAD'овская таблица, ИМХО, более чем соответствует самым различным требованиям. Да, ее надо настроить. Да, там есть несколько "косяков". Но и те, по-моему, связаны больше с применением разных шрифтов (по аналогии в Multileader).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.08.2009, 14:22
#7
acyxou


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


Цитата:
Сообщение от Sleekka Посмотреть сообщение
Извините на другие аргументы у меня времени нет.
Это типа ксиву показал и все заткнулись?
__________________
Users are not stupid, they are busy.

Последний раз редактировалось acyxou, 27.08.2009 в 14:28.
acyxou вне форума  
 
Непрочитано 27.08.2009, 14:36
#8
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Во-первых, atable поддерживается и работает в версиях вплоть до 2010. то, что сайт начальный переехал - еще ничего не значит. Я atable не пользуюсь - как-то не до того
Алексей, вы наверное не в курсе, но в atable который новый и идет к 2008 и выше автокадам, Alxd не реализовал всех функций которые были в старом, например, нельзя подключать модули, да ALxd продает эту софтину но ему не до поддержки сейчас (это объективно). Atable - да это прекрасный табличный редактор внутри када, не то что стандартный, но есть объективные причины, мы слезли с него не успев залезть, а уже были мысли как он впишется в нашу работу, но тот момент когда под 2008 ядро Atable вышел через год с неполным функционалом перечеркнул, все плюсы (мы не можем взять и остановить процесс на год). Либо нужно заключать договорные отношения с автором, а не покупать коробочный софт.
Цитата:
Да, ее надо настроить. Да, там есть несколько "косяков".
Вы уже забыли про баг с невыделением текста в файле, при наличие таблиц, или вы забыли про баг с блоком внутри таблицы. Да таблицы может и устраивают "теток", но нормальному программисту написать программу рисования таблиц - это семечки. А когда через пару лет поменяют табл. редактор и объектную модель вместе с ним, будете вы свои программы переписывать, линии не поменяют никогда, тем более нужно готовиться к разработке под ZWcad.
Sleekka вне форума  
 
Непрочитано 27.08.2009, 14:41
#9
Кулик Алексей aka kpblc
Moderator

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


Возвращаясь к начальному вопросу: попробуй
Код:
[Выделить все]
(defun test (/ ent cols row_count col_count h min_h)
  (vl-load-com)
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (ssname (ssget "_+.:S:E" '((0 . "ACAD_TABLE"))) 0)
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (logand (cdr (assoc 70 (entget (tblobjname "layer" (cdr (assoc 8 (entget ent))))))) 4) 0)
           ) ;_ end of and
    (progn
      (setq ent       (vlax-ename->vla-object ent)
            cols      (vla-get-columns ent)
            row_count 0
            col_count 0
            h         0.
            min_h     8.
            ) ;_ end of setq
      (while (< row_count (vla-get-rows ent))
        (setq h (max h (vla-getrowheight ent row_count)))
        (if (/= (rem h min_h) 0.)
          (vla-setrowheight ent row_count (+ min_h (* (fix (/ h min_h)) min_h)))
          ) ;_ end of if
        (setq row_count (1+ row_count) h 0.)
        ) ;_ end of repeat
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.08.2009, 14:58
#10
acyxou


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


Кулик Алексей aka kpblc круть! Вроде работает!
Тока надо бы доработать чтоб лисп НЕ изменял ячейки, в которых Row Style и/или Cell Style имеют значения Header или Title. Почему так? Потому что я имею несколько стилей Data (Data Decimal, Data Whole, Data text)
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 27.08.2009, 15:01
#11
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Идея хороша, но
Цитата:
Т.е. если в ячейке одна строка с текстом, то высота ячейки должна быть 8мм. Если две строки - то 16мм... и т.д.
случай когда две строки текста написаны в ячейке высотой меньше 8 мм, обработается неправильно (т.е. не так как нужно автору темы, зачем пускаться в отхождение от ТЗ только чтобы выложить код демонстрирующий работу с объектной моделью таблицы?
Я скажу одно: если бы был Mtext и line, то у mtexta хотя бы есть linespasing factor, есть высота шрифта и есть bounding box, там было бы гораздо проще анализировать эту задачу, с таблицами увы.
Sleekka вне форума  
 
Автор темы   Непрочитано 27.08.2009, 15:07
#12
acyxou


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


Цитата:
случай когда две строки текста написаны в ячейке высотой меньше 8 мм, обработается неправильно
А по-моему Алексей все сделал правильно! Высота ячейки регулируется не в зависимости от количества строк в ячейке, а в зависимости от высоты текста, т.е. влазит ли он в ячейку или нет... Кажется это намного практичней чем то, как полагал я это должно быть...
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 27.08.2009, 15:14
#13
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


За влазит или нет отвечает табличный редактор, а там просто сделано округление по восьмеркам, причем округление только вверх, если у тебя будет одна строка высотой 9 мм, то станет 16 мм.
Sleekka вне форума  
 
Непрочитано 27.08.2009, 15:21
#14
Кулик Алексей aka kpblc
Moderator

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


Sleekka, чо ты такой злой-то?
Значит так, бага с "невыделением текста" я не ловил (или рассказывай подробнее, что там не покатило). Про блок внутри таблицы знаю, обходил в свое время. Сейчас уже решения не вспомню.
acyxou, достаточно ввести всего одну проверку (кстати, добавил еще и снятие автоматического пересчета таблицы - для ускорения обработки):
Код:
[Выделить все]
(defun test (/ ent cols row_count col_count h min_h fun_ent-modify-table-autoupdate-set)

  (defun fun_ent-modify-table-autoupdate-set (tbl update /)
                                             ;|
*    Функция устанавливает или снимает автообновление объекта ACAD_TABLE
*    Параметры вызова:
*	tbl	vla-указатель на таблицу
*	update	снять обновление (nil) или установить его (t). При установке
		автообновления заодно выполняется vla-update таблицы
|;(vl-catch-all-apply
      (function
        (lambda ()
          (cond
            ((vlax-property-available-p tbl 'regeneratetablesuppressed t)
             (vla-put-regeneratetablesuppressed
               tbl
               (if update
                 :vlax-false
                 :vlax-true
                 ) ;_ end of if
               ) ;_ end of vla-put-regeneratetablesuppressed
             )
            ((vlax-property-available-p tbl 'recomputetableblock t)
             (vlax-put-property
               tbl
               'recomputetableblock
               (if update
                 :vlax-true
                 :vlax-false
                 ) ;_ end of if
               ) ;_ end of vlax-put-property
             )
            ) ;_ end of cond
          ) ;_ end of lambda
        ) ;_ end of function
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of defun

  (vl-load-com)
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (ssname (ssget "_+.:S:E" '((0 . "ACAD_TABLE"))) 0)
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (logand (cdr (assoc 70 (entget (tblobjname "layer" (cdr (assoc 8 (entget ent))))))) 4) 0)
           ) ;_ end of and
    (progn
      (setq ent       (vlax-ename->vla-object ent)
            cols      (vla-get-columns ent)
            row_count 0
            col_count 0
            h         0.
            min_h     8.
            ) ;_ end of setq
      (fun_ent-modify-table-autoupdate-set ent nil)
      (vl-catch-all-apply
        (function
          (lambda ()
            (while (< row_count (vla-get-rows ent))
              (if (and (member (vla-getrowtype ent row_count) (list acdatarow acunknownrow))
                     ;|  ((lambda (/ col_count res)
                          (setq col_count 0)
                          (repeat (vla-get-columns ent)
                            (setq res (or res
                                          ((lambda (/ pdata ptype)
                                             (vla-getcelldatatype ent row_count col_count 'pdata 'ptype)
                                             (member pdata (list acdatarow acunknownrow))
                                             ) ;_ end of lambda
                                           )
                                          ) ;_ end of or
                                  ) ;_ end of setq
                            ) ;_ end of repeat
                          res
                          ) ;_ end of lambda
                        )|;
                       ) ;_ end of and
                (progn
                  (setq h (max h (vla-getrowheight ent row_count)))
                  (if (/= (rem h min_h) 0.)
                    (vla-setrowheight ent row_count (+ min_h (* (fix (/ h min_h)) min_h)))
                    ) ;_ end of if
                  ) ;_ end of progn
                ) ;_ end of if
              (setq row_count (1+ row_count)
                    h         0.
                    ) ;_ end of setq
              ) ;_ end of repeat
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      (fun_ent-modify-table-autoupdate-set ent t)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Дальше. Насчет высот строк и прочего. Можно сделать и это, и еще массу другого - было бы желание.
Sleekka, ты для MTEXT'a задай принудительно Width меньше реальной ширины (например, 1.1) и потом попробуй получить для него BoundingBox. Например, создай многострочник по команде
Код:
[Выделить все]
(defun ab ()
  (entmakex
    '((0 . "MTEXT")
      (100 . "AcDbEntity")
      (67 . 0)
      (410 . "Model")
      (8 . "0")
      (48 . 100.0)
      (100 . "AcDbMText")
      (10 17295.2 20059.1 0.0)
      (40 . 2.5)
      (41 . 4.74727)
      (46 . 0.0)
      (71 . 1)
      (72 . 5)
      (1 . "asdffadsdfasdfadfasdfaf\\Pzxcvzcvzxv\\P\\Psdfasdf")
      (7 . "SPDS")
      (210 0.0 0.0 1.0)
      (11 1.0 0.0 0.0)
      (42 . 29.3669)
      (43 . 15.3236)
      (50 . 0.0)
      (73 . 1)
      (44 . 1.0)
      )
    ) ;_ end of entmakex
  ) ;_ end of defun
Потом выполни
Код:
[Выделить все]
(vla-GetBoundingBox (vlax-ename->vla-object(car(entsel))) 'minp 'maxp)
и построй результат:
Код:
[Выделить все]
(command "_.rectang" "_none" (vlax-safearray->list minp) "_none" (vlax-safearray->list maxp))
А я посмотрю как ты будешь плеваться.
Дальше. "<...>нормальному программисту написать программу рисования таблиц - это семечки<...>" Ну, значит я - ненормальный программист. Я написать подобное не могу (если вспоминать, например, про внесение изменений в таблицу - как предлагаешь делать? По правому клику вызывать конт.меню? А у тебя не было случаев, что конт.меню отключают пользователи? Или по двойному клику? Ну так запусти такой код, например, в ADT или MEP и добейся корректной работы штатных инструментов). А ты можешь? А если можешь, чего ж молчишь как рыба об лед?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 01.09.2009 в 14:37. Причина: Исправил код
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.08.2009, 16:00
#15
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


1. bounding box mtexta обходится функциями из express-ov, VVA меня этому научил.
2.
Цитата:
Я написать подобное не могу (если вспоминать, например, про внесение изменений в таблицу - как предлагаешь делать? По правому клику вызывать конт.меню? А у тебя не было случаев, что конт.меню отключают пользователи? Или по двойному клику?
нужно удалить старую таблицу и получить новую, я рассматриваю таблицу как средство вывода информации при работе всей системы, как правило редактировать таблицы при таком системном подходе не требуется. Таблица - это конечный продукт. Я говорю про функцию разграфки строк и функции вписывания данных в эти строки. Я не собираюсь писать редактор аналогичный atable. У меня другая философия. Я искренне не понимаю зачем возиться с объектами высокого уровня. Ну дин блоки еще туда сюда, хотя что делать с кросплатформенностью софта - очень грустно становится. Но таблицы и мультилидеры - это все лишнее. Вроде на все ответил. А баг с text-ми, алексей ты же сам его лечил, это тот который texttofront лечится, но прикол в том что если не используются table в файле то такой баг никогда не возникает.
ЗЫ. Я рассматриваю форум как средство для обсуждения интересных кодов и идей, идея о том чтобы не использовать объекты акада высокого уровня мне кажется весьма интересной, но выкладывание простого кода уровня example из helpa мне кажется безобразием, здесь и работодатели то не появляются зачем писать коды по каждому зову не хотящих делать самостоятельно. ИМХО так они не научатся, а когда научатся тогда пойдет мода на нашу тему и потянется работодатель, в итоге все равно выкладывать здесь код или нет на расклад в мире это никак не повлияет.

Последний раз редактировалось Sleekka, 27.08.2009 в 16:05.
Sleekka вне форума  
 
Автор темы   Непрочитано 27.08.2009, 16:18
#16
acyxou


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


Кулик Алексей aka kpblc, что-то я не пойму.... то ли лыжи не едут, то ли я того самого.... Почему у меня первый код работает, а второй нет!?
Код:
[Выделить все]
Command: (test)


Select objects:
; error: too few arguments
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 27.08.2009, 16:20
#17
Кулик Алексей aka kpblc
Moderator

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


Дык ессно, я ж один аргумент по запарке пропустил да (princ) в конце не вставил Код в #14 исправил
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.08.2009, 16:36
#18
acyxou


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


Кулик Алексей aka kpblc, значит все таки лыжи Пасиб, щас погоняем...

Вобщем, все круто, но неплохо было бы еще замеченный тов. Sleekka недостаток устранить
Цитата:
округление только вверх, если у тебя будет одна строка высотой 9 мм, то станет 16 мм
Прикладываю файл, в котором есть таблица, и по всей логике прога не должна ничего изменить в этой таблице, а она изменяет шапку.
Вложения
Тип файла: dwg
DWG 2007
Test.dwg (124.8 Кб, 639 просмотров)
__________________
Users are not stupid, they are busy.

Последний раз редактировалось acyxou, 27.08.2009 в 16:45.
acyxou вне форума  
 
Непрочитано 29.08.2009, 23:13
#19
Archeo

архитектор
 
Регистрация: 02.04.2006
Беларусь
Сообщений: 348


Я что-то пропустил? О каком баге с блоком внутри таблицы идёт речь?
Archeo вне форума  
 
Непрочитано 29.08.2009, 23:42
#20
Кулик Алексей aka kpblc
Moderator

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


acyxou, код (#14) доработал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Оптимизация таблиц

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оформление таблиц и спецификаций vfhc Разное 5 26.02.2009 12:59
Создание таблиц Кулик Алексей aka kpblc Программирование 8 09.12.2008 14:34
Отслеживание ТАБЛИЦ на чертеже [программно] TwoZero Программирование 7 07.05.2008 10:52
Создание таблицы из нескольких таблиц по условию Sergey57 Программирование 6 26.04.2007 12:30