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

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

Lisp. Работа с таблицами AutoCAD

Ответ
Поиск в этой теме
Непрочитано 19.12.2014, 11:43
Lisp. Работа с таблицами AutoCAD
SNIIP
 
Регистрация: 04.05.2010
Сообщений: 338

Разбираюсь с созданием таблицы из под лиспа. Прочитал на форуме темы. Научился создавать таблицу, заполнять ее на основе лиспа:
Код:
[Выделить все]
(defun C:demo-tablo()
(vl-load-com)
;; Список наименований столбцов
(setq tabelle_ueberschrift (list "Столбец 1"
"Столбец 2"
"Столбец 3"
"Столбец 4"
)
)
; список текста порядно:
;;; (setq tabellen_liste
;;; (list (list "1.1" "2.1" "3.1" "4.1")
;;; (list "1.2" "2.2" "3.2" "4.2")
;;; (list "1.3" "2.3" "3.4" "4.3")
;;; (list "1.4" "2.4" "3.5" "4.4")
;;; )
;;; )

;список текста в ячейках построчно:
(setq tabellen_liste
(list (list "1.1" "1.2" "1.3" "1.4")
(list "2.1" "2.2" "2.3" "2.4")
(list "3.1" "3.2" "3.3" "3.4")
(list "4.1" "4.2" "4.3" "4.4")
)
)
;; вставка табличного объекта
(setq vlaxchen_tabelle
(vla-addtable
;; в пространство модели
(vla-get-modelspace (vla-get-activedocument 
(vlax-get-acad-object)))
;; точка вставки
(vlax-3d-point (list 0 0 0))
;; число ячеек
(+ (length tabellen_liste) 2)
;; число столбцов
(length tabelle_ueberschrift)
;; высота строки
500.0
;; ширина столбца
3000.0
)
)
;; заполнение заголовка таблицы
(vla-settext
vlaxchen_tabelle
0
0
"Название таблицы"
)
;; выравнивание в ячейке
(vla-setcellalignment vlaxchen_tabelle 0 0 acmiddlecenter);0 0
;; высота текста в ячейке
(vla-setcelltextheight vlaxchen_tabelle 0 0 300.);5
;; начальный индекс цикла
(setq spalte 0)
(foreach item tabelle_ueberschrift
;; шапка таблицы
(vla-settext vlaxchen_tabelle 1 spalte item)
;; выравнивание
(vla-setcellalignment vlaxchen_tabelle 1 spalte acmiddlecenter)
;; высота текста
(vla-setcelltextheight vlaxchen_tabelle 1 spalte 250.)
;; следующий цикл
(setq spalte (1+ spalte))
)
;; начало со 2-й ячейки (первая - нулевая - название таблицы)
(setq zeile 2);2
;; первая строка
(setq spalte 0)
;; цикл по ячейкам
(foreach zeilen tabellen_liste
;; Заполнение ячеек:
(foreach item zeilen
;; ввод текста
(vla-settext vlaxchen_tabelle zeile spalte item)
;; выравнивание
(vla-setcellalignment vlaxchen_tabelle zeile spalte 
acmiddlecenter)
;; высота текста
(vla-setcelltextheight vlaxchen_tabelle zeile spalte 250.);1.65
;; следующий цикл
(setq spalte (1+ spalte))
)
;; следующая ячейка
(setq zeile (1+ zeile))
;; обнуляем цикл
(setq spalte 0)
)

(princ)
)
(C:demo-tablo)
Теперь интересует следующее...
1 - как объединить некоторые ячейки,
2 как задать разные ширины столбцов
3 как настроить границы у ячеек?? или у всей таблицы?
4 и как еще удалить столбцы или строки?

Последний раз редактировалось SNIIP, 19.12.2014 в 11:52.
Просмотров: 19861
 
Непрочитано 10.07.2020, 11:09
#21
FatherAlexy


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


Возможно, я не совсем по теме данной ветки, но при работе с таблицей автокада есть следующая проблема.
Имеются связанные таблицы в автокаде и экселе. При обновлении связей в автокаде в таблице некоторые ячейки меняют свой размер (в частности высоту ячейки) из-за того что текст ячейки не помешается при данном коэффициенте сжатия текста. Возможно ли сделать так, чтобы при выборе "проблемной" ячейки и нажатии написанного лиспа или макроса, коэффициент сжатия текста подбирался бы таким образом, чтобы он автоматически помещался в ячейку автокада заданной ширины и высоты. Сначала, конечно, нужно разблокировать ячейку...Если у кого есть какие мысли, буду признателен, если подскажите. Спасибо!
FatherAlexy вне форума  
 
Непрочитано 13.07.2020, 12:21
#22
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Я с помощью макроса редактирую таблицу.
Сначала делаю связь с таблицей эксель, вставляю таблицу в модель. Потом запускаю макрос. Он выставляет ширину каждого столбца, высоту текста и прочие настройки.
Пока только так
Alexeipost вне форума  
 
Непрочитано 26.10.2022, 14:14
#23
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Всем привет!

Напомните, плиз, метод, позволяющий установить в ячейке
таблицы отступ текста по вертикали и горизонтали.

Не тип выравнивания SetCellAlignment, а именно сдвижку
текста по ячейке.

Собственно, борюсь со сдвижкой текста по вертикали, если
в нем попадается прописная "р" (с хвостиком ниже базовой
линии).
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 26.10.2022 в 14:40.
===AAA=== вне форума  
 
Непрочитано 26.10.2022, 14:47
1 | #24
Кулик Алексей aka kpblc
Moderator

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


Кажется, что-то связанное с Margin. Поищи в справке по ActiveX
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.03.2023, 11:31
#25
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 103


Можно ли установить выравнивание ячеек во всей таблице? Т.е. без указание конкретного "адреса" ячейки методом vla-SetCellAlignment

UPD: после обновления данных Excel часто слетает выравнивание в таблице (сохранять форматирование excel - не всегда хорошо с точки зрения времени обновления)

Хочу к определенным колонкам таблицы применить требуемое выравнивание.
Если перебирать ВСЕ ячейки и применять к ним выравнивание, процесс может занять определенное время

Т.е. допустим
- после обновления связи с данными выравнивание становится рандомным
- делаю выравнивание ВСЕХ ячеек таблицы по центру
- а далее последовательное производим выравнивание ячеек определенного столбца таблицы "влево по центру" vla-SetCellAlignment (путем перебирания всех строк таблицы)

Последний раз редактировалось Sege, 24.03.2023 в 12:41.
Sege вне форума  
 
Непрочитано 24.03.2023, 18:14
#26
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Цитата:
Сообщение от Sege Посмотреть сообщение
Если перебирать ВСЕ ячейки и применять к ним выравнивание, процесс может занять определенное время
Надо отключать обновление экрана и обновление таблиц (какие именно команды смогу сказать в понедельник, когда буду на работе).
А так, да, именно перебором всё устанавливается
Alexeipost вне форума  
 
Непрочитано 24.03.2023, 18:29
#27
Кулик Алексей aka kpblc
Moderator

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


vla-put-tablesuppressed, кажется.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.03.2023, 08:11
#28
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 103


vla-put-RegenerateTableSuppressed
она?
Sege вне форума  
 
Непрочитано 27.03.2023, 08:24
1 | #29
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Отключение регенерации таблицы: MyTable.RegenerateTableSuppressed=true
Потом включение регенерации (False) и регенерация таблицы: MyTable.RecomputeTableBlock
Alexeipost вне форума  
 
Непрочитано 27.03.2023, 09:19
#30
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 103


Спасибо!
Отключил на время исполнения программы REGENMODE и RegenerateTableSuppressed
Все заработало в разы быстрее.
Sege вне форума  
 
Непрочитано 27.03.2023, 14:38
#31
csi


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


Может кто подскажет, каким будет Lisp для:

1. Запуск Lisp
2. Выбор таблиц (если можно — все таблицы)
3. Вкл/Выкл регенерацию/тормоза (on/off)
csi вне форума  
 
Непрочитано 28.03.2023, 07:31
#32
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Не lisp конечно, но vba (хоть что-то)
Sub Sort_table_SKS()
Dim sSetObj As AcadSelectionSet
If ThisDrawing.SelectionSets.Count > 0 Then​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 'Удаляем все наборы таблиц
​ ​ ​ For i = 0 To ThisDrawing.SelectionSets.Count - 1
​ ​ ​ ​ ​ ​ ​ If ThisDrawing.SelectionSets.Item(i).Name = "SSET" Then
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ThisDrawing.SelectionSets("SSET").Delete
​ ​ ​ ​ ​ ​ ​ End If
​ ​ ​ Next
End If
​ ​ ​ ​ Set sSetObj = ThisDrawing.SelectionSets.Add("SSET")​ ​ ​ ​ ​ ​ ​ ​ 'Создаем новый набор таблиц
Dim mode As Integer
Dim gpCode(0) As Integer
Dim dataValue(0) As Variant
Dim groupCode As Variant, dataCode As Variant
Dim oTab As AcadTable
Dim MyTable As AcadTable
Dim Proverka As String
Dim j As Integer
Dim KCells As Integer
Dim k As Integer
Dim S2 As String
mode = acSelectionSetAll
gpCode(0) = 0
dataValue(0) = "Acad_Table"
groupCode = gpCode
dataCode = dataValue
sSetObj.Select mode, , , groupCode, dataCode
For Each oTab In sSetObj 'Перебираем все таблицы в Модели
​ ​ ​ Set MyTable = oTab
​ ​ ​ ​ MyTable.RegenerateTableSuppressed = True 'Отключаем регенерацию таблиц для увеличения скорости работы
With MyTable​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 'Форматируем таблицу (начало)
​ ​ ​ .SetColumnWidth 0, 20​ ​ ​ ​ ​ ​
​ ​ ​ ​ .SetColumnWidth 1, 80
​ ​ ​ .SetColumnWidth 2, 57
​ ​ ​ .SetColumnWidth 3, 28
​ ​ ​ .HorzCellMargin = 2
End With
For i = 0 To MyTable.Rows - 1
​ ​ ​ With MyTable
​ ​ ​ .SetCellTextHeight i, 0, 2.5
​ ​ ​ .SetCellAlignment i, 0, acMiddleCenter
​ ​ ​ .SetCellTextHeight i, 1, 2.5
​ ​ ​ .SetCellAlignment i, 1, acMiddleCenter
​ ​ ​ .SetCellTextHeight i, 2, 2.5
​ ​ ​ .SetCellAlignment i, 2, acMiddleCenter
​ ​ ​ .SetCellTextHeight i, 3, 2.5
​ ​ ​ .SetCellAlignment i, 3, acMiddleCenter
​ ​ ​ End With​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 'Форматируем таблицу (конец)
Next i
​ ​ ​ MyTable.RegenerateTableSuppressed = False Включаем регенерацию таблицы
​ ​ ​ MyTable.RecomputeTableBlock (True)​ ​ ​ ​ ​ ​ 'Регенерируем таблицу
'Вкл. и выкл. Регенерации необходим, чтобы применились свойства таблицы, такие как высота, чтобы подшлифовать высоту строк чуть ниже.
'Если не регенерировать таблицы, то вот это вот If .GetRowHeight(i) > 10.1 Then​ ​ работать не будет.
​ ​ ​ MyTable.RegenerateTableSuppressed = True 'Отключаем регенерацию таблиц для увеличения скорости работы
For i = 0 To MyTable.Rows - 1
​ ​ ​ With MyTable
If .GetRowHeight(i) > 10.1 Then​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 'Чтобы было красиво увеличиваем высоту строки до целого числа
​ ​ ​ k = Round(.GetRowHeight(i) + 2, 0)
​ ​ ​ .SetRowHeight i, k
​ ​ ​ Else
​ ​ ​ .SetRowHeight i, 8
​ ​ ​ End If
​ ​ ​ End With
Next i
With MyTable
​ ​ ​ .SetRowHeight 0, 10
​ ​ ​ .SetRowHeight 1, 10
​ ​ ​ .SetRowHeight 2, 10
End With
​ ​ ​ MyTable.RegenerateTableSuppressed = False 'Включаем регенерацию таблиц
​ ​ ​ MyTable.RecomputeTableBlock (True)​ ​ ​ ​ ​ ​ 'Регенерируем таблицу
Next oTab
sSetObj.Delete​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 'Удаляем набор таблиц
End Sub
Alexeipost вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Работа с таблицами AutoCAD

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Lisp. Как в лиспе извлечь размер дин блока. Corvin LISP 6 14.09.2014 18:42
LISP. Как изменить размер окна Autocad PDM LISP 10 26.03.2012 02:52
На что влияет высота и размер ячеек георешетки Ded_M03ay Прочее. Архитектура и строительство 2 30.08.2011 17:56
Lisp, таблицы и символы типа "в квадрате", "в кубе", "градус" Uduzr LISP 12 17.03.2010 16:40