Jump to content
  • entries
    21
  • comments
    5
  • views
    6,078

About this blog

Проба пера ...

Entries in this blog

A.Kudrjashov

<Каталог>

<nanoCAD. Программирование и автоматизация>

 

Подготовил на Powershell скрипт синтаксического разбора LISP модулей с последующей генерацией диаграммы связности функций при помощи GraphViz.

 

Актуальная версия скрипта будет пока лежат здесь.
Сейчас скрипт в первом приближении.

 

Я запускаю скрипт из под ISE, но, в принципе, работает и из командной строки.

 

Скрипт опробован на трех модулях:

bgtools_3.11a_Nc_21.lsp,
pltools_NC.lsp,

StripMtext_v5-0c1_NC.lsp

 

При запуске скрипта предлагается выбрать LISP файл для анализа и отметить списки, которые необходимо по окончании работы экспортировать в Excel.
Результатом работы является текстовый файл в каталоге \dot.

 

Для обработки текстового файла необходим комплект утилит GraphViz. Я экспериментировал с утилитами Dot, Circo и Twopi.

В каталоге \dot лежат командные файлы заточенные под мои каталоги. Их необходимо отредактировать.

 

Кроме этого, можно экспериментировать с:
опциями заполнения окончательного изображения диаграмм (строка опции в текстовом DOT файле)
ratio=fill|expand
с размером генерируемых изображений в дюймах (строка опции в текстовом DOT файле)
size=24|36|48
c опцией разрешения изображения для растров (опция в командном файле)
-Gdpi=0|100|200|300

... с другими параметрами

 

Важно!
При обработке утилитами GraphViz почему то в режиме имен файлов по умолчанию "-O" нормально воспринимаются любые имена файлов, а при указании конкретных имен  "-o" только имена файлов без пробелов.

 

В результате получаем схему взаимосвязей вызовов функций вида:

bgtools_3.11a_Nc_21.lsp

Спойлер

bgtools_3.11a_Nc_21-2_circo.thumb.jpg.ee8d024afa7c3ec570bc7311fcb06c2a.jpg

 

 

pltools_NC.lsp

Спойлер

pltools_NC_dot.thumb.jpg.8de235f6c69e1ec4c73ce1cfd539580e.jpg

 

 

StripMtext_v5-0c1_NC.lsp

Спойлер

StripMtext_v5-0c1_NC_twopi.thumb.jpg.a1fcee54b1387b40d7fe26c39b29020f.jpg

 

 

 

 

 

A.Kudrjashov

<Каталог>

<nanoCAD. Программирование и автоматизация>
 

(Перевод стаей о типах LISP из Справки к AutoCAD 2015 и дополнительная информация специфичная для nanoCAD)

 

Integer

AutoCAD 2015. LISP. About Integers

Integer - это целые числа, которые не содержат десятичной точки. Для хранения целых чисел используется 32 бита. 31 бит используется для хранения числа а один бит для хранения знака числа. Диапазон целых чисел в целом находится в пределах +/- 2^31 или (от - 2 147 483 648 до 2 147 483 647). Как утверждается в Справке к AutoLISP AutoCAD 2015, в некоторых функциях значения Integer интерпретируются как 16-битные чиста в пределах от - 32 678 до 32 677.

 

Однако, практика показывает, что на данный момент не всё так однозначно.

 

Например, если в nanoCAD выполнить присвоение переменной числа 2 147 483 647, то вместо ожидаемого максимально возможного целого числа, получим действительное число (REAL). А, при последующем добавлении к нему единицы значение данного действительного числа будет увеличиваться в положительную сторону. При этом, если мы инициируем переменную значением 2 147 483 646, то получим правильную верхнюю границу INT в 2 147 483 647 и переход к отрицательным значениям при последующем прибавлении 1 (единицы).

Спойлер

image.png.d7d30f699180e6287f6d5fcfde1195f5.png

 

Но, если мы инициируем переменную не числом 2 147 483 647, а выражением (setq xInt (- (expt 2 31) 1)), что, казалось бы, должно привести к аналогичному результату, результат получим совершенно другой.

Спойлер

image.png.24d723debb4be9f6dbd922f2522a2818.png

 

Более того, оказывается, что в AutoCAD 2015 и в nanoCAD 20.1 "граница" между INT и REAL в случае выполнения вышеупомянутых арифметических операций и оценке типа переменной при помощи функции type выглядит несколько по разному.

AutoCAD:

Спойлер

image.png.cd01163655f28a3c4710ff12b6c13663.png

 

nanoCAD:

Спойлер

image.png.c4d3859424c04540cfa7d5d3db419ec1.png

 

Предполагается, что, в случае превышения результата арифметических операций над INT, результат автоматически приводится к REAL. Однако, практика показывает, что это не всегда верно. Рассмотрим две операции сложения и умножения вида:
1) 384 758 647 * 12 = 4 617 103 764

2) 384 758 647 + 4 232 345 117 = 4 617 103 764

Предполагается, что операции будут эквивалентными, но в действительности получаем:

Спойлер

image.png.eb02717afa79e0b70a83df521a012f84.png

 

Резюме. Для корректной работы с целыми числами необходимо быть полностью уверенным, что их значения не выйдут за границы целочисленных значений LISP. Если есть сомнения, то лучше использовать действительные (REAL) числа, осознано преобразовывая их обратно к целочисленным значениям, в случае использования функций, работающих только с INT. Да, это трудоёмко и не всегда удобно, однако, позволит избежать непредсказуемых ошибок преобразования типов, как описанных выше, так и не описанных.

 

Real

AutoCAD 2015. LISP. About Reals

REAL - это действительные числа с десятичной точкой. Числа в диапазоне от -1 до 1 могут содержать 0 (ноль) слева от десятичной точки.

Значения REAL занимают 64 бита и соответствуют типу double в Си.

Границы допустимых значений типа REAL примерно от 4.94 x 10-324 до 1.79 x 10308.

Спойлер

image.png.b5f6f274fa03663251d2f1914358383e.png

 

При выходе за эти границы, будет получено значение "Infinity" (бесконечность) или 0.0 (ноль).

 

Поскольку представленные десятичные числа имеют одинарную точность, то Машинный эпсилон (наименьшее положительное число) ε, при котором не распознаются два числа a и b:

1 < a/b < 1+ε,  

ε ≈ 5,96 x 10-8.

 

Похоже, что Мантисса действительного числа состоит из 7 знаков, включая десятичную точку. И не просто состоит, но записывается в память именно с такой точностью.

Спойлер

image.png.0da6b5eece2dc24fee3dc7487dc71144.png

 

Поскольку в AutoLISP как AutoCAD, так и nanoCAD отсутствуют функции округления из Common LISP, типа round или trancate, прикладываю файл с функциями от Lee Mac.

http://www.lee-mac.com/round.html

LM_round.lsp

 

Что нужно знать про арифметику с плавающей запятой

 

List

AutoCAD 2015. LISP. About Lists

AutoCAD 2015. LISP. About Point Lists

AutoCAD 2015. LISP. About Dotted Pairs

 

List - это базовый тип LISP, представляющий собой Списки атомарных элементов и других списков.

 

Функции, используемые для получения доступа к элементам списков:

Спойлер

image.png.b423940c638345f061049ecf45a97bb9.png

 

Для получения доступа к координатам 2D и 3D точек в точечных списках рекомендуется обращаться не через функцию nth, а через функции: car - для доступа к первой координате, cadr - для доступа ко второй координате и caddr - для доступа к третьей координате.

 

Функции car и cdr могут последовательно комбинироваться и обеспечивать доступ к атомарным элементам и вложенным спискам иерархического списочного дерева до 4-го уровня вложенности.

car, cdr .... cddddr

 

About Entity Context and Coordinate Transform Data

 

 

 

Обсуждение на форуме.

2020-10-14 LISP в nanoCAD 20.1
https://forum.nanocad.ru/index.php?/topic/11617-lisp-v-nanocad-201/&tab=comments#comment-74317

 

 

×
×
  • Create New...