|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Вопросы по Lisp
инженер (КМ)
Красноярск
Регистрация: 30.10.2004
Сообщений: 3,837
|
||
Просмотров: 33682
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
(ssget "_X" '((0 . "LINE")) - выберет линии по всему файлу
(ssget '((0 . "LINE"))) - отфильтрует отрезки из выбора пользователя
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
> Лентяй : Ай-яй-яй, мама, попка, больно!
![]() > Krieger : Сугубо ИМХО. Кад не очень качественно работает с буфером обмена, да и в многодокументном режиме лисп может вызвать несколько труднопонятных ошибок: тут функция загружена, тут - нет. Тут такие значения, тут - эдакие. Наверняка можно решить по другому (а если нельзя, то попробуй использовать функции vl-bb-*, работающие с внедокументными переменными, либо setenv / getenv, что тоже не фонтан - это же все обнулять надо, а в какой момент выполнять обнуление - кто знает?)... Чего надо сделать?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Так это проще сделать так, я думаю:
Код:
Добавлено: Вставлять как блок можно, конечно, только вряд ли это требуется в этой задаче. А если сильно надо, то тогда уж смотреть на ruCAD с его решениями.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
> Лентяй : А разве возможно через такой метод интерактивно получить точку вставки в неактивном документе? Ее же надо как-то хитро задавать ИМХО... В общем, головняк. Я б постарался не связываться.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
kpblc Малость не то, надо какой-то аналог ctrl+c, ctrl+v А зачем там функция if? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
IF - чтобы отследить, был ли выбор. Если выбора не было, то ничего не делается. Так что ничего сверхъестественного
![]() Если надо именно полный аналог, то тогда действительно без создания временного анонимного блока не обойтись (а потом его разбивать)...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Project Engineer Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392
|
Цитата:
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
А также ShaggyDoc, Alasher, {Smirnoff}... Если есть возможность сделать неправильно, рано или поздно найдется Кулибин, который именно так и сделает. Функция должна быть надежна, как шпала. Или как топор - кому как больше нравится
![]() От компа за лишнюю проверку не убудет, а мне поспокойнее.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Project Engineer Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392
|
Цитата:
![]() |
|||
![]() |
|
||||
Project Engineer Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392
|
Krieger, ловите прогу, ибо добр аз есмь днесь. Первая создает набор для копирования, вторая - копирует.
Код:
|
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Лентяй
Спасибо, пригодится. Цитата:
Не совсем ctrl+c, т.к. после удаления примитивов которые значатся в наборе копировать будет нечего. |
|||
![]() |
|
||||
Регистрация: 12.09.2005
Барнаул
Сообщений: 77
|
Уважаемые мастера и гуру по AutoCAD не сможете ли вы объяснить как на LISP написать функцию в которой указываешь примитивы (не только Line, PLine но и Cirle, Arc..) а она выдает точки пересечения этих примитивов. Для отрезков я как понимаю есть стандартная функция, [ insers ] а для других примитивов?
|
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
> Ratmir
Для других примитивов есть метод IntersectWith, он доступен через vla- функции. Иногда глючит. Есть еще довольно безглючный метод, его описание можно найти в школьных учебниках геометрии ![]() > Krieger Можно удалить из списка все ненужные группы, тогда останутся нужные ![]() Функция vl-remove-if-not вполне годится для этого. Либо, передать нужные группы в отдельный список Код:
|
|||
![]() |
|
||||
Project Engineer Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392
|
Цитата:
![]() Код:
|
|||
![]() |
|
||||
Регистрация: 12.09.2005
Барнаул
Сообщений: 77
|
Лентяй спасибо за функцию.
Возможно у меня кривые руки (Lisp не так давно занимаюсь, а изучал его институте так давно –(, что все забыл ), но как vla- функции заставить работать? Ниже привожу код и сообщение об ошибке. Данный пример я для себя делаю чтобы разобраться как работают некоторые функции и немного научится Lisp. ;;; ----------------------------------------------------------------------------------------------- ;;; Функция объединяющая "Extend" и "Trim" если необходимо работать с несколькими примитивами ;;; Сначала выбираем с какой функцией работать ("Trim" - по умолчанию) ;;; Указываем границу (выбирается только одна граница) до которой примитивы будут редактироваться ;;; Линией указываем какие примитивы пересекающие ее будут редактироваться ;;; ;;; Аналог функций "Extrim" в "Express Tolls" ;;; ;;; Trim and Extend.LSP ;;; ;;; Исходник взят из книги "The ABC's of AutoLISP" Автор: George Omura. ;;; Функцию IntPtLst разработал Лентяй (Сан-Франциско) - сайт www.DWG.ru ;;; Пояснения и изменения: Ratmir ;;; ;;; ----------------------------------------------------------------------------------------------- (defun c:ExTr (/ x y u sset1 count mcount icount imcount int1 obj sa PtLst) (graphscr) (grclear) (initget "Extend Trim") (setq EorT (getkword "\Extend или <Trim>: ")) (if (equal EorT "")(setq EorT "Trim")) (princ "\n Выбирите границу...") (setq obj (car (entsel))) (setq x (getpoint "\n Укажите начальную точку оси которая будет пересекать примитивы для редактирования: ")) (setq y (getpoint x "\n Укажите конечную точку оси: ")) (setq sset1 (ssget "c" x y)) (setq count 0) (if (/= sset1 nil) (progn (setq mcount (sslength sset1)) (while (< count mcount) (setq elst (ssname sset1 count) );конец setq ;;; ---------------------- ;;; -- Функция IntPtLst -- ;;; ---------------------- (setq sa (vlax-variant-value (vla-IntersectWith elst obj acExtendNone)) n 0) (cond (sa (while (< n (vlax-safearray-get-u-bound sa 1)) (setq PtLst (cons (mapcar '(lambda (m) (vlax-safearray-get-element sa m)) (list n (1+ n) (+ 2 n))) PtLst) n (+ 3 n))));sa (T nil) );cond (reverse PtLst) ;;; ---------------------- (setq icount 0) (setq imcount (length PtLst)) (while (< icount imcount) (setq int1 (nth (icount- 1) PtLst)) (if (equal EorT "Extend") (command "_.extend" obj "" int1 "") (command "_.trim" obj "" int1 "") );конец if (setq icount (1+ icount)) );конец while (setq count (1+ count)) );конец while );конец progn );конец if );конец функции ExTr ;;; ----------------------------------------------------------------------------------------------- Выдает сообщение --------------------------------- Command: extr Extend или <Trim>: Выбирите границу... Select object: Укажите начальную точку оси которая будет пересекать примитивы для редактирования: Укажите конечную точку оси: ; error: bad argument type: VLA-OBJECT <Entity name: 7ef65e98> Command: --------------------------------- |
|||
![]() |
|
||||
Регистрация: 12.09.2005
Барнаул
Сообщений: 77
|
У меня вопрос как избавиться, что бы некоторые размеры не оставались на месте, если их с объектом перемещать или копировать (слой не заморожен). Иногда при создании копии одного пространства листа, на нем изменить расположения размеров, то на источники они отображаются как на новом, но при изменении стиля они отображаются нормально
|
|||
![]() |
|
||||
Project Engineer Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392
|
Ratmir, в вашей прграмме используются vla-функции, которые работают с ОБЪЕКТАМИ, вперемешку с LISP-функциями, которые работают с ПРИМИТИВАМИ. Поскольку вы не обеспечили преход от одного типа к другому, АвтоКАД выдает сообщение об ошибке.
С другой стороны, если вы собираетесь использовать свою программу только для отрезков (LINES), то вам моя функция не нужна, потому что она предназначена для определния точек множественных пересечений, например круг с прямоугольником или две извилистых полилинии. Ниже приводится вариант, написанный на ActiveX, т.е. с использованием vla-функций для "подравнивания" линий. Извините за английский, но при копировании русский текст крякозябрится. Код:
Успехов! |
|||
![]() |
|
||||
Регистрация: 12.09.2005
Барнаул
Сообщений: 77
|
Лентяй спасибо за ответы. Функция, которую вы дали, иногда странно обрезает Line. Для обрезания и удлинения только примитивов Line я использую следующую функцию.
;; ------------------------- (defun c:ExTr (/ x y u sset1 count mcount icount pt1 pt2 int1 obj) (graphscr) (grclear) (initget "Extend Trim") (setq EorT (getkword "\Extend или <Trim>: ")) (if (equal EorT "")(setq EorT "Trim")) (princ "\n Выбирите границу...") (setq obj (car (entsel))) (setq x (getpoint "\n Укажите начальную точку оси которая будет пересекать примитивы для редактирования: ")) (setq y (getpoint x "\n Укажите конечную точку оси: ")) (setq sset1 (ssget "c" x y)) (setq count 0) (if (/= sset1 nil) (progn (setq mcount (sslength sset1)) (while (< count mcount) (setq elst (entget (ssname sset1 count)) mtypeLine (cdr (assoc 0 elst)) ) (if (= mtypeLine "LINE") (progn (setq pt1 (cdr (assoc 10 elst)) pt2 (cdr (assoc 11 elst)) int1 (inters x y pt1 pt2 T) ) (if (equal EorT "Extend") (command "_.extend" obj "" int1 "") (command "_.trim" obj "" int1 "") ) ) (princ "\n Выбран не Line") ) (setq count (1+ count)) ) ) ) ) ;; ------------------------- Но не для всех примитивов можно использовать функцию assoc и inters. Вычислять с помощью формул геометрии, точки пересечения разных примитивов утяжеляет функцию (для меня). Вопрос не подскажите сайт или литературу (в свободном распространении) по LISP, где много примеров и подробно их разбирают, а то если и нахожу по одно и тоже (рисование дорожки с плиткой). Хотелось более лучше изучить LISP, сейчас разбираюсь по книге George Omula “The ABC’s of AutoLISP” (с трудом ![]() ![]() P.S. Поздравляю всех девушек сайта www.DWG.ru с наступающем 8 МАРТА (по новому стилю) и всех кто празднует 23 февраля по старому стилю. :P |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Как узнать на лиспе, выбраны элементы в данный момент или нет? В зависимости от того выбраны они или нет должно выполняться то или иное действие. Если элемент выбран, то его слой будет меняться, если нет будет устанавливаться другой слой текущим.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Проверяй длину и наличие выбора:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Я бы попробовал примерно так:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
to kpblc
Цитата:
Спасибо. to Лентяй Твой пост для Крыса? Если не только для него, то объясни шо с этим делать. Не все-ж такие умные. Код:
|
|||
![]() |
|
||||
Project Engineer Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392
|
Цитата:
![]() Код:
в смысле "утиль". Тогда будет ляпота, щастя и благорастворение воздУхов. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Код:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 12.02.2006
Сообщений: 114
|
Kpblc и Лентяй
Спасибо за ответ, но мне нужен доступ к FaceRecord и FaceVeertex ? Свойства: ; IAcadPolyfaceMesh: IAcadPolyfaceMesh Interface ; Property values: ; Application (RO) = #<VLA-OBJECT IAcadApplication 00d077b4> ; Coordinate = ...Indexed contents not shown... ; Coordinates = (9.0 10.0 0.0 8.2 10.0 0.0 ... ) ; Document (RO) = #<VLA-OBJECT IAcadDocument 0141ac48> ; Handle (RO) = "4C5" ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 1284d2b4> ; Layer = "0" ; Linetype = "CONTINUOUS" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Material = "ByLayer" ; NumberOfFaces (RO) = 112 ; NumberOfVertices (RO) = 130 ; ObjectID (RO) = 2130370280 ; ObjectName (RO) = "AcDbPolyFaceMesh" ; OwnerID (RO) = 2130369968 ; PlotStyleName = "ByLayer" ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 1284d240> ; Visible = -1 Они отсутствуют в свойствах, через ent* функции доступ к ним возможен это подпримитивы то что представлено вами это PolygonMesh а мне нужен PolyFaceMesh |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Есть предложение - приложить файлик и показать, как ты добирался до этих элементов.
Провокационный вопрос: если можно добраться через (entget), то зачем использовать именно vla?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Моя программа выполняет несколько действий:
Сначала отключаем привязки, потом что-то чертим (через функцию command), восстанавливаем привязки. Пользователь после нажатия кнопки увидел полученный результат, но он ему не понравился и нажимает ctrl+z - ничего не происходит, нажимает еще раз - начерченный объект исчезает. На этом он успокаивается и продолжает работать дальше и весьма скоро замечает что привязки-то не работают. Вообщем вопрос, как сделать чтобы ctrl+z отменял всю пользовательскую функцию скопом, за раз. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Одним из следующих способов:
1. либо поставить (command "_.undo" "_begin") в начале и (command "_.undo" "_end") в конце. Лично мне такой подход просто не очень нравится, но это дело вкуса 2. Либо получить указатель на активный документ (setq adoc (vla-get-activedocument (vlax-get-acad-object))) и опять же поставить метки начала и конца: (vla-startundomark adoc) ;; чего-то творим (vla-endundomark adoc)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Да в общем-то нет. Просто выполнение (command) при cmdecho=1 оставляет следы в ком.строке, а (vla) - нет. Все равно ж из функции выход "тихий" (т.е. в конце стоит (princ))?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Гхм... Я б и рад файлик посмотреть, но 2007-й не установлен...
Попробуй такой код, у меня вроде как сработало: Код:
Добавлено: Чуток подправил код - там было непонятно, какой катет каким будет
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
:shock:
Молодо - зелено. Цитата:
Хотя может действительно создавать блоки не отходя от кассы... Блок в 2000-м: [ATTACH]1152780812.dwg[/ATTACH] |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Цитата:
Насчет блока... Можно, конечно, и полилинию туда засобачить, и штриховку. Просто я со сваркой пока не воевал особо, вот и сделал как мог ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
Цитата:
Подскажи как найти в списке стилей (например dimstyle), стиль который бы содержал в названии слова data? [ATTACH]1152845400.gif[/ATTACH] |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
По структуре программы для рисования разреза шва.
1. Должен быть отрисован разрез с заданным катетом, а в программах запрашиваются точки, то есть размер катета вычисляется. Для получения требуемого катета надо достаточно сложно указать точку, например, со смещением. Иначе будет "на глаз". Лучше хранить значение катета (например, обычный 6 мм), и только при его изменении - сохранять. Или 2 размера, если они могут быть разные 2. При запросе вершины выводить текущий катет и иметь опцию для его изменения. 3. Зациклить ввод точки вершины (с выходом из цикла при пустом вводе), так как таких треугольничков обычно надо сразу несколько нарисовать, зачем же вызывать заново программу. 4. Сам треугольник все-таки лучше блоком. А если завтра захочется треугольничек "с брюшком", то не надо переписывать достаточно сложное программное создание определения блока. 5. Запрашивать не точки катета, а его ориентацию (поворот). При этом ориентация может указываться проще, чем одновременное указание конца катета для определения его размера. 6. А если шов не в виде прямоугольного треугольника, а косого? Этот вариант тоже надо учитывать. В этом случае может быть запрос и направления второго катета, но тогда не блоком рисовать. И, конечно, обработка ошибок. Чтоб программа была надежной, как лом. В варианте Kr_AngleWeld, "прекрасно работает" пока программу использует сам автор. Достаточно прервать при выполнении любого ввода и далее будет прерывание функции. А обработчика прерывания нет. К тому же зачем-то после вставки еще и ручное масштабирование выполняется. Тоже не защищенное от ошибки. Если при запросе "Укажите катет" запрашивался не размер катета, а только его направление, то так и надо спрашивать. Но зачем же дублировать? |
|||
![]() |
|
||||||||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Ну вот, а начиналось все:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Из истории: Сначала вставлял просто блок - прямоугольный треугольник и был у меня ма-а-а-ахонький макросик: Код:
Потом оказалось что этого мало и надо бы сделать для разных углов (не только прямоугольные). Да еще иногда масштабировать. И написал макросик посложнее: Код:
Потом решил таки переделать в lsp. И теперь там 30строк. У Крыса в два раза больше. И оказалось что все хреново. |
|||||||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
> Krieger : Ну извини, на что хватило, то и сделал
![]() ![]() ![]() Насчет стилей: Список размерных стилей можно получить, например, так: Код:
![]() Код:
> Krieger : Цитата:
![]() Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Вот как такая программа делается с использованием функций ruCAD. Показываю не для того, чтобы применять (внутри используются спецфункции). Просто, чтобы продемонстрировать подход к структуре программы (цикл, возможность выбора опций во время ввода).
Все проверки, блокировки, обработка ошибок спрятаны внутри спецфункций ru-*, загружаемых в главной библиотеке. Рисование треугольника производится просто солидом, без создания блока. Код:
|
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цикличность я добавил, обработку ошибок сделал, пустой ввод обрабатывается, проверку наличия слоя сделал. На первое время сойдет, а чтобы сделать как советует ShaggyDoc мне еще работать и работать :cry: , но к этому надо стремиться.
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
to kpbls >
Цитата:
Я вообще сюда влез не ради критики конкретных кодов, а чтобы подтолкнуть на другой подход, на создание более надежных программ. Функция Kr_AngleWeld удовлетворяет автора - и хорошо. Она проста и без всяких "закавыков". И всегда можно подправить себе (undo включить и т.п.). Для массового, "отчужденного" использования надо делать сложнее внутри (это скрыто от пользователя) и проще и гибче "снаружи" > Krieger Цитата:
|
|||
![]() |
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
Господа, хорошие!!! Есть ли какая-нибудь приличная (!) альтернатива команде "_area" для вычисления площади поверхности твёрдого тела. (Хотелось бы ActiveX методы) Проблема c "_area" - не могу её применить для тел лежащих внутри блоков, не открывая редактор блока, а это очень сильно замедляет программу если блоков выше крышы!!!
[sm1400] ???? |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
Цитата:
Как вариант - прицепить значения непосредственно к телам (например, в XDATA) после их создания или при создании блока. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Можно по идее попробовать получить примитив через (nentsel) и к нему уже применять _area
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
Цитата:
-> kpblc Команда: (setq ename (car (nentsel)))(print ename)(command "_area" "О" ename) ;выбираю вложенное тело: Выберите объект: <Имя объекта: 7ef70e50> _area Первая угловая точка или [Объект/Добавить/Вычесть]: О Выберите объекты: <Неверное имя объекта: 7EF70E50> nil "_area" по всей видимости дружит только с примитивами экрана (как например "ssget" |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Похоже на особенность функциклирования _area. У меня тоже не сработало
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
Цитата:
|
|||
![]() |
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
-> VVA Очень интересно, почему после (vlax-invoke item 'Explode) само вхождение остаётся в рисунке? (думал оно автоматом удаляется!)
Работает довольно быстро, большое спасибо, но моя программа как вы и хотели вначале должна создать именно атрибут с площадью тела в блоке. Есть на входе <имя примитива> 3dsolid в описании блока, нужна его площадь. Я делаю примерно так: Код:
А по поводу открывать-закрывать - это пример. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
|
|||
![]() |
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
->VVA Пардон!!! обознался (VA)
Я кстати немецкий когдато изучал, а с английским PROMT выдаёт такую белиберду: Вы не должны взорвать блок, чтобы управлять его объектами непосредственной составляющей. Все выделения блока имеют метод Элемента{Пункта}, которые позволяют Вам управлять объектами в пределах блока, не взрывая выделение блока непосредственно. Да и вообще я с Автокадом и В. Лиспом только-только начал знакомиться... |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
А насчет атрибута, на форуме были лиспы по созданию блоков методами ActiveX как из примитивов так и из существеющих блоков. Поищи. А еще лучше спроси у kpblca. У него этого добра есть. ![]() Например здесь http://www.arcada.com.ua/forum/viewt...er=asc&start=0 сообщение Добавлено: Пт 23 Июн , 2006 12:37 и здесь http://my.opera.com/kpblc/blog/ Скачай Cadware и посмотри, там лисп, есть чего подсмотреть :wink: Можно сделать проще, включить в новый блок обработанный + артибут с его площадью. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Вы не дожны взрывать/ расчленять (бррр уголовшина) блок чтобы манипулировать с его примитивами. Все блоки (определения блоков) имеют метод Item, который позволяет манипулировать элементами блока без его взрывания. Использование vla-item Последний раз редактировалось VVA, 18.09.2015 в 23:52. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Но в таком случае ты работать будешь с описанием блока, а не с конкретной вставкой (а для вставки могут быть установлены разные коээфициенты масштабирования, соответственно площадь будет уже другой).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
->VVA :roll: Немного о разном говорим. Мне этот вопрос (area) интересен в целях образования. Как чего писать (за что спасибо!) это одно , а вот новая идея это другое. Эта часть программы у меня давно уже готова и работает, но осталось чувство что можно было бы лучше.
Ведь как работает "area" с телом - наверно, извлекает из тела грани, из них замкнутые полилинии, а дальше считает (как-то) площадь замкнутой полилинии (например, как vlax-curve-getArea), а где-то програмисты поленились или лоханулись и теперь у меня такая вот проблема. Может есть идеи с vlax-curve-getArea ??? Хотелось бы тут копать!!! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Так ета... (vlax-curve-*), по-моему, работает только с кривыми, насколько я знаю. Солиды это другое.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Поковыряй с помощью этого
Пособие по расшифровке DXF регионов и солидов И здесь обсуждали http://www.autocad.ru/cgi-bin/f1/board.cgi?t=23596eY |
|||
![]() |
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
->kpblc
Это не мой случай, поэтому о масштабах думать не надо. Программа об этом думает на предыдущих этапах. Всё верно, но ведь тела - это набор граней, а они вершинами, как и полилинии. (Всё ж только зашифровано, а это очень не удобно!) |
|||
![]() |
|
||||
Регистрация: 22.06.2005
Rostov-on-Don
Сообщений: 5
|
как контролировать ESC (или любую другую клавишу) во время выполнения LISP программы?
пример: Код:
процедура зачиски меня не интересует, я её напишу, но вот перехват нажатия кнопок (с последующим вызовом определенной процедуры) я нигде не нашел. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
"На все случаи жизни" корректный выход по ESC не получится. При нажатии ESC в работу включается стандартная функция *error*. Обычно ее переопределяют. В общем случае именно здесь должно быть восстановление всех требуемых параметров. И соответствующая структура программы - не делать досрочного выхода через exit и quit в разных местах, а всегда делать единственный штатный выход с завершением всех логически требуемых действий.
В Lisp, в отличие от других систем программирования, функции типа Exit вываливают сразу из программы, а не в структуру более высокого уровня. Самое лучшее - написать "низкоуровневые" функции для любого ввода (то есть момента, когда пользователь реально может прервать программу). А обработчики досрочных прерываний оставить на случаи, когда пользователь прерывает "зависшие" длительные действия. Подробно обо всем этом см. книгу "САПР на базе AutoCAD - как это делается" - здесь цитировать нет времени. Там используется единственная низкоуровневая функция ввода, заменитель всех get*-функций. Позволяет вводить все, что угодно с опциональными значениями по умолчанию, ключевыми словами, базовыми точками и т.д. Нажатие ESC во время ввода блокируется, но всегда имеется возможность штатного выхода по умолчанию или в контекстном меню. Что касается обработки любых клавиш, то это возможно с помощью функции grread. Она позволяет делать экзотичные действия, но в рядовых ситуациях применять ее не стоит. Подобные функции сделаны и для выбора примитивов - чтобы проконтролировать осознанно ли отказался пользователь от указания объекта, или просто промахнулся. В таких случаях можно использовать анализ системной переменной ERRNO. Кроме того, имеется замечательная функция vl-catch-all-error-p (и vl-catch-all-apply), позовляющая отлавливать любые ошибки (вплоть до деления на 0), не разрушая программу. Она же предотвращает неправильные движения "шаловливых ручек". Если заключить vl-catch-all-error-p в свою функцию-обертку, то можно и предотвращать ошибки, и получать о них внятные сообщения, и предусматривать правильный дальнейший ход программы. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Как сделать возможность выбора опций при указке точки (getpoint)\объекта (entsel)? Т.е. например:
(while (setq (getpoint "\nУкажите начальную точку [Delta] <Выход> :")) -- );end while Так вот если не нажал enter и не указал точку, но ввел ключевое слово, например delta, надо будет указать эту delta, после чего вернуться указке точки. Что-то наподобие того о чем говорил ShaggyDoc в 62-м посте: Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Комбинацию (initget) И (getpoint), наверное? Я не уверен, потому как не особо работал с такими задачами...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 22.08.2006
/dev/null
Сообщений: 92
|
to krieger
(while (not flag) (initget "Line Scale" 128) (setq t1 (getpoint "\nНачальная точка или[Line/Scale]: ")) (cond ((eq t1 "Scale") (setq brkscale (getreal "\nМасштаб символа разрыва= ")) (princ (strcat "\nМасштаб= " (rtos brkscale 2 0)))) ((eq t1 "Line") (setq protobreakln (car (entsel)) protobreakln-elist (entget protobreakln) t1 (cdr (assoc 10 protobreakln-elist)) t2 (cdr (assoc 11 protobreakln-elist)) flag t) ) ((eq (type t1) 'list) (setq flag t) (setq t2 (getpoint t1 "\nКонечная точка-> ")))));end while |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Еще вопросики:
1. После использования функции (entmod) изменяемый объект пропадает с экрана (но выделяется) и появляется только после регенерации (_regen). Регенерацию после каждого изменения объекта в больших чертежах делать накладно. Можно ли регенерировать отдельный объект? Пробывал функцию redraw - непомогло. 2. Почему не загружается VLX приложение функцией load, если не указать полный путь к файлу (однако путь прописан в путях поддержки)? Может есть какие аналоги - пробежаться по путям доступа и найти мое приложение? 3. Как сравнить два списка? Одинаковые - T, нет - nil. 4. Как определить вес линий назначенный слою. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
1. Попробуй (entupd) либо (vla-update).
2. Может, (findfile)? 3. Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.05.2007
Москва
Сообщений: 1
|
Очень надеюсь на вашу помощь в решении задачи:
С помощью представления cond или case определить функцию, которая возвращает в качестве значения столицу заданного аргумента государств. Реализовать на Lisp300. Заранее благодарен. ----------------------------------------------------------- В Xlisp удалось реализовать таким образом: Код:
Необходимо переделать под Lisp300. |
|||
![]() |