Autocad как переместить курсор в lisp
Перейти к содержимому

Autocad как переместить курсор в lisp

  • автор:

Можно ли получить текущие координаты курсора?

Можно ли получить текущие координаты курсора, относительно окна AutoCAD?

#2 Ответ от Александр Ривилис 11 декабря 2006г. 15:55:12

  • Откуда: Украина / Киев
  • На форуме с 15 апреля 2005г.
  • Сообщений: 8,661
  • Спасибо: 158
Re: Можно ли получить текущие координаты курсора?

#3 Ответ от Евгений Елпанов 11 декабря 2006г. 16:39:48

  • Откуда: Москва
  • На форуме с 2 июля 2004г.
  • Сообщений: 2,538
  • Спасибо: 10
Re: Можно ли получить текущие координаты курсора?

> Spirit

#4 Ответ от Владимир Громов 11 декабря 2006г. 18:49:12

  • На форуме с 10 июля 2004г.
  • Сообщений: 8,349
  • Спасибо: 4
Re: Можно ли получить текущие координаты курсора?

> Евгений Елпанов
Это же баловство.

#5 Ответ от Евгений Елпанов 11 декабря 2006г. 19:03:39

  • Откуда: Москва
  • На форуме с 2 июля 2004г.
  • Сообщений: 2,538
  • Спасибо: 10
Re: Можно ли получить текущие координаты курсора?

> Владимир Громов
А ты думаешь, что на такой вопрос нужно показать более серьезную программу?
Тогда дам ссылку на другой форум, на тему, где много программ использующих вычисление текущих координат курсора.
http://www.theswamp.org/index.php?topic=12813.0;all
Может, это тоже баловство, но зато по взрослому.

#6 Ответ от Владимир Громов 11 декабря 2006г. 19:17:32

  • На форуме с 10 июля 2004г.
  • Сообщений: 8,349
  • Спасибо: 4
Re: Можно ли получить текущие координаты курсора?

> Владимир Громов
В принципе мы видим текущие координаты курсора в статусной строке. Что-то мне сомнительно, что этот бессмысленный набор координат можно как-то применить. Даже дрожание руки или стола отражается на экране. Вот определение конкретных точек — другое дело. Или использовать команду "_sketch" ("эскиз").

#7 Ответ от Александр Ривилис 11 декабря 2006г. 19:27:46

  • Откуда: Украина / Киев
  • На форуме с 15 апреля 2005г.
  • Сообщений: 8,661
  • Спасибо: 158
Re: Можно ли получить текущие координаты курсора?

> Евгений Елпанов

> Владимир Громов
А вам не кажется что имелись в виду не те координаты? IMHO речь шла об экранных координатах курсора в окне AutoCAD.

#8 Ответ от Евгений Елпанов 11 декабря 2006г. 19:30:45

  • Откуда: Москва
  • На форуме с 2 июля 2004г.
  • Сообщений: 2,538
  • Спасибо: 10
Re: Можно ли получить текущие координаты курсора?

> Владимир Громов
Это раздел Лисп..
Иногда нужно получить текущие координаты из программы, чтоб отрисовывать на экране в реальном времени.
Как пример изменение радиуса дуги:

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

#9 Ответ от Spirit 12 декабря 2006г. 06:51:53

  • На форуме с 29 ноября 2006г.
  • Сообщений: 30
  • Спасибо: 0
Re: Можно ли получить текущие координаты курсора?

Спасибо, вам, конечно, большое, но нужны именно экранные координаты курсора.

#10 Ответ от Владимир Громов 12 декабря 2006г. 09:01:08

  • На форуме с 10 июля 2004г.
  • Сообщений: 8,349
  • Спасибо: 4
Re: Можно ли получить текущие координаты курсора?

> Spirit
А что это значит: "экранные координаты курсора"? И Александр Ривилис что-такое намекает.

#11 Ответ от Spirit 12 декабря 2006г. 09:06:34

  • На форуме с 29 ноября 2006г.
  • Сообщений: 30
  • Спасибо: 0
Re: Можно ли получить текущие координаты курсора?

Наверно, я неправильно выражаюсь..
Мне необходимо осуществить следующее:
Есть форма на ObjectDCL, прикрепленная к границе окна. Нужно, чтобы при подведении мыши к границе, она появлялась, а при отводе от нее, скрывалась.
Для этого нужно знать координаты в области экрана AutoCAD, а не в области листа или модели.

#12 Ответ от Владимир Громов 12 декабря 2006г. 09:47:38

  • На форуме с 10 июля 2004г.
  • Сообщений: 8,349
  • Спасибо: 4
Re: Можно ли получить текущие координаты курсора?

> Spirit
Да. "Неправильно выражаюсь" — это мягко сказано. Теперь понятно, что вы хотите, но понятно и то, что эта тема не для меня.

#13 Ответ от Александр Ривилис 12 декабря 2006г. 23:30:06

  • Откуда: Украина / Киев
  • На форуме с 15 апреля 2005г.
  • Сообщений: 8,661
  • Спасибо: 158
Re: Можно ли получить текущие координаты курсора?

> Spirit
На чистом лиспе это не сделать. Кроме того для того чтобы форма появлялась и исчезала это должен быть фоновый процесс (т.е. что-то типа реактора).

#14 Ответ от Spirit 13 декабря 2006г. 06:40:03

  • На форуме с 29 ноября 2006г.
  • Сообщений: 30
  • Спасибо: 0
Re: Можно ли получить текущие координаты курсора?

Ну, раз нельзя.
Все равно спасибо..
Хотя бы прекращу тщетные поиски

#15 Ответ от Евгений Елпанов 13 декабря 2006г. 09:40:46

  • Откуда: Москва
  • На форуме с 2 июля 2004г.
  • Сообщений: 2,538
  • Спасибо: 10
Re: Можно ли получить текущие координаты курсора?

> Александр Ривилис
Согласен, с глобальным реактором в лиспе очень туго.
Но если задачу упростить, например, программа в цикле запрашивает точки. Тогда, можно отслеживать перемещение курсора в нужную область и вызывать окно диалога, например, для смены каких либо опций, типа сменить блок, слой и.т.д.

> Spirit
Для вычисления местоположения курсора в пиксельном — экранном представлении, тебе понадобится, вышеупомянутая функция GRREAD и несколько системных переменных
SCREENSIZE
VIEWCTR
VIEWSIZE
и преобразование координат
TRANS
Если не получится, спрашивай, помогу.

Как отредактировать лисп в автокаде?

В меню Сервис выберите AutoLISP, а затем выберите Редактор Visual LISP или введите в командной строке: VLIDE или VLISP [Enter].

Как написать лисп в AutoCAD?

Все, что вам нужно сделать, это ввести CUI в командной строке. Затем найдите категорию «Файлы LISP» в разделе «Настройка во всех файлах» диалогового окна НПИ, щелкните ее правой кнопкой мыши и выберите «Загрузить Lisp» в контекстном меню. Перейдите к месту, где находится ваш файл LISP, и он появится в списке.

Как редактировать файл LSP?

lsp щелкните правой кнопкой мыши и выберите «Создать» > «Текстовый документ». Сменить имя на акад. лсп. Теперь вы сможете дважды щелкнуть файл и, как правило, отредактировать его в Блокноте.

Как сохранить lisp в AutoCAD?

Перейдите на ленту AutoCAD> вкладка «Управление»> панель приложений. Нажмите загрузить приложение. В диалоговом окне загрузки/выгрузки приложений просмотрите и найдите ранее сохраненный файл AutoLISP. Выберите его и нажмите загрузить.

Что такое файл .LSP?

Файлы LSP — это файлы, содержащие программные коды в виде простого текста, которые могут выполняться при использовании интерпретатора Lisp. Эти файлы также известны как ассемблерные коды языка программирования высокого уровня, которые бывают двух разновидностей, известных как Common Lisp и Scheme.

Что такое лисп AutoCAD?

AutoLISP — это диалект языка программирования Lisp, созданный специально для использования с полной версией AutoCAD и его производными, включая AutoCAD Map 3D, AutoCAD Architecture и AutoCAD Mechanical.

Как сделать ЛСП?

Перейдите в «Инструменты»> «Параметры»> «Расположение файлов»> «Система»> «Развернуть раздел «Путь поиска вспомогательных файлов», справа щелкните вкладку «Новая», «Обзор» и выберите папку «D: LISP Files» (переместите вверх по этому пути)> «Применить» и «ОК». Перезапустите DraftSight или откройте новый файл при запуске. lsp загрузится автоматически.

Где находится «Академ ЛСП»?

Место, где сохранить акад. lsp или акаддок. lsp зависит от того, чего вы хотите достичь, но он будет загружен только в том случае, если он будет найден в одном из ваших путей поддержки, как указано в «Параметры» > «Файлы» > «Путь поиска файлов поддержки».

Где находится файл Acaddoc LSP?

Поэтому любое программирование, которое вы поместите в этот файл, будет загружаться автоматически каждый раз при открытии или запуске чертежа, независимо от того, как установлена ​​переменная ACADLSPASDOC. Как и АКАД. Файл LSP, ACADDOC. LSP обычно находится в подкаталоге SUPPORT установки AutoCAD.

Autocad как переместить курсор в lisp

Рассматриваются функции Автолиспа, обеспечивающие доступ к примитивам графической базы данных Автокада.
Функции позволяют:

  • получить ссылку на указанный примитив или список таких ссылок;
  • получить описание примитива;
  • изменить это описание, а затем и сам примитив.

Так, в нижеприведенном коде

(setq en (entlast))
(setq ed (entget en))

функция entlast возвращает последний введенный примитив (ссылку на этот примитив), а функция entget – описание этого примитива. К примеру, если последним введенным примитивом была линия, начинающаяся в точке [0, 0, 0] и завершающаяся в точке [200, 200, 0], то функция entget вернет список из пяти элементов:

((-1 . <Entity name: 7ffff705bc0>)
(0 . «LINE»)
(330 . <Entity name: 7ffff7039f0>)
(5 . «234»)
(100 . «AcDbEntity»)
(67 . 0)
(410 . «Model»)
(8 . «0»)
(100 . «AcDbLine»)
(10 0.0 0.0 0.0)
(11 200.0 200.0 0.0)
(210 0.0 0.0 1.0)
)

Из примера видно, что описание элемента это список, содержащий подсписки — преимущественно точечные пары. Первый элемент подсписка содержит код (идентификатор) свойства примитива (в данном случае линии), а второй или последующие — это значение свойства. Так свойство с кодом 8 указывает на слой, в котором примитив расположен, а свойство с кодом 10 содержит начальные координаты линии, а с кодом 11 — ее конечные координаты.
Часть свойств может быть изменена. В частности, можно изменить слой или координаты вершин линии.
Также рассматриваются функции tblnext и tblsearch, обеспечивающие доступ к таблицам графической базы данных Автокада.
Для последующей проработки формулируется задача создания помошника построения блок-схем вычислительных алгоритмов, позволяющего вдобавок переводить блок-схему алгоритма в его линейную схему.

Доступ к примитиву

Обеспечивают следующие функции:

С описанием ed примитива часто употребляются следующие функции:

Пример. Написать функцию, перемещающую начальную вершину линии вдоль оси Х на заданное значение.

(defun mvVrtX (x / ed en p pt)
(setq en (car (entsel «Select a line:»)))
; Check primitive type
(if en
(progn
(setq ed (entget en))
(if (= (cdr (assoc 0 ed)) «LINE»)
(progn
(setq p (assoc 10 ed)
pt (cdr p)
pt (cons (+ (car pt) x) (cdr pt))
ed (subst (cons 10 pt) p ed)
)
(entmod ed)
(alert «Done»)
)
(alert «Line should be selected»)
)
)
)
(princ)
)

Функцию можно набрать в редакторе Автолиспа (меню Tools — AutoLISP — Visual LISP Editor). Далее сохранить код, например, в файле c:\mvVrtX.lsp, который затем следует загрузить в командной строке Автокада

или воспользоваться меню Tools — Load Application.
Для перемещения вершины на 400 единиц по оси Х в командной строке следует набрать

и нажать на Enter.

Задание. Написать функцию, перемещающую линию на другой слой рисунка.

Работа с наборами примитивов

Набор es примитивов возвращается функцией

Некоторые варианты употребления функции:

(ssget) — последует предложение указать примитивы мышью: «Select objects:»;
(ssget «L») — вернет набор с последним введенным в рисунок примитивом;
(ssget ‘(200 200 0)) — вернет набор примитивов, проходящих через точку (200 200 0);
(ssget «С» ‘(0 0) ‘(200 200)) — вернет набор примитивов, пересекаемых рамкой от (0 0) до (200 200);
(ssget «X» список фильтров) — вернет набор примитивов, отвечающих заданным фильтрам.

Каждый фильтр — это точечная пара, в котором первый элемент — это идентификатор свойства примитива, а второй — значение этого свойства. Например:

вернет все примитивы, расположенные на слое «gdb».
А функция

(ssget «X» ‘((8 . «gdb») (0 . «INSERT»)))

вернет все блоки, расположенные на слое «gdb».
Некоторые идентификаторы для фильтров ssget:

Рис. 1. Диалог выбора цвета примитива

Пример. Написать функцию, удаляющую все линии на слое «gdb», имеющие цвет с индексом 170 (синий цвет).

(defun dltBlGdb (/ es)
(setq es (ssget «X» ‘((0 . «LINE») (8 . «gdb») (62 . 170))))
(if es
(progn
(setvar «cmdecho» 0)
(command «_ERASE» es «»)
(setvar «cmdecho» 1)
(alert «Done»)
)
(alert «Empty»)
)
(princ)
)

Работа с набором примитивов es ведется с помощью следующих функций:

Пример. Написать функцию, переносящую на слой «gdb» со слоя «0» линии, имеющие в наборе линий четные номера.

(defun ftchLns0Gdb (/ cntEs ed en es k)
(if (tblsearch «LAYER» «gdb»)
(progn
(setq es (ssget «X» ‘((0 . «LINE») (8 . «0»))))
(if es
(progn
(setq k 0
cntEs (sslength es)
)
(while (< k cntEs)
(setq en (ssname es k)
ed (entget en)
ed (subst (cons 8 «gdb») (assoc 8 ed) ed)
)
(entmod ed)
(setq k (+ k 2))
)
(alert «Done»)
)
(alert «Empty»)
)
)
(alert «Layer ‘gdb’ not found»)
)
(princ)
)

Таблицы графической базы данных

Таблицы графической базы данных хранят сведения о компонентах рисунка: его слоях, блоках, типах линий и пр.
Для получения данных, хранимых таблицами Автокада, употребляются функции tblnext и tblsearch.
К строке таблицы позволяет обратиться функция

(tblnext tn [f]),

в которой tn — это имя таблицы, например, «LAYER», «LTYPE», «BLOCK» и др.
Таблица с именем «LAYER» содержит строки с информацией о слоях рисунка, с именем «BLOCK» — о блоках рисунка и т. д.
Аргумент f задает порядок просмотра таблицы. Если аргумент задан и отличен от nil, то tblnext вернет первую строку таблицы, в противном случае tblnext вернет следующую за текущей строку таблицы.
Так, вызов

(tblnext «LAYER» T)

вернет первую строку таблицы слоев:

((0 . «LAYER») ; Имя таблицы
(2 . «0») ; Имя слоя
(70 . 0) ; Флаг состояния слоя (в данном случае видимый и текущий)
(62 . 7) ; Индекс цвета слоя
(6 . «Continuous») ; Тип линии (задана сплошная линия)
)

Функция tblnext вернет nil, если в таблице нет строк или если указатель переместился за пределы таблицы.
Функция

(tblsearch tn s [f])

вернет строку таблицы tn, в которой имеется в точечная пара (2 . s).
В зависимости от типа таблицы s — это имя слоя (таблица «LAYER»), или имя блока (таблица «BLOCK»), или имя типа линии (таблица «LTYPE») и т. д.
Если искомой точечной пары нет, то функция вернет nil.
Аргумент f определяет порядок последующего употребления функции tblnext: если f задан и отличен от nil, то tblnext, вызванная без параметра f, переместит указатель на строку, следующую за строкой, найденной tblsearch.

Пример 1. Создать несколько 9 слоев с именами «gdb1», «gdb2», . «gdb9». Вывести строки таблицы «LAYER», расположенные вслед за строкой с точечной парой (2 . «gdb6»).

(defun prntSmLrs (/ k nm tRw)
(setq k 1)
(setvar «cmdecho» 0)
; Make layers first
(while (< k 10)
(setq nm (strcat «gdb» (itoa k))
k (1+ k)
)
(if (not (tblsearch «LAYER» nm)) (command «_layer» «_m» nm «»))
)
(setvar «cmdecho» 1)
; Find table row with dotted pair (2 . «gdb6»)
(tblsearch «LAYER» «gdb6» T)
; Print next table rows
(while (setq tRw (tblnext «LAYER»))
(print tRw)
)
(princ)
)

((0 . «LAYER») (2 . «gdb7») (70 . 0) (62 . 7) (6 . «Continuous»))
((0 . «LAYER») (2 . «gdb8») (70 . 0) (62 . 7) (6 . «Continuous»))
((0 . «LAYER») (2 . «gdb9») (70 . 0) (62 . 7) (6 . «Continuous»))

Пример 2. Вывести все строки таблицы «LAYER» (то есть сведения о все слоях рисунка).

(defun lLrs ( / tRw)
(print (tblnext «LAYER» T))
(while (setq tRw (tblnext «LAYER»))
(print tRw)
)
(print «Done»)
(princ)
)

Редактирование атрибутов блока

Задача рассматривается на следующем примере: функция mkBlckBn на базе примитива RECTANGLE создает блок bn с двумя атрибутами at1 и at2. Первому атрибуту задается значение R1, а второму — P68. Блок записывается в файл c:/bn.dwg и затем вставляется в центр рисунка. Функция attrMdfr меняет значение первого атрибута вставленного блока на R23 и делает второй атрибут блока невидимым.

; Создание блока с двумя атрибутами
(defun mkBlckBn ( )
(setq fn «c:/bn.dwg»)
(setvar «cmdecho» 0)
; Delete all blocks
(if (setq es (ssget «_X» ‘((0 . «INSERT»))))
(command «_ERASE» es «»)
)
(command «_LIMITS» ‘(0 0) ‘(160 120)
«_GRID» «_off»
«_ZOOM» «_W» ‘(0 0) ‘(160 120))
; Make a block first
(command «_RECTANGLE» ‘(0 0) ‘(60 30)
«_ATTDEF» «» «at1» «» «R1» «_m» ‘(30 15) 10 «»
«_ATTDEF» «» «at2» «» «P68» «_m» ‘(30 40) 10 «»
)
(if (findfile fn)
(command «_WBLOCK» fn «_y» «» ‘(0 0) «_w» ‘(-20 -20) ‘(61 50) «»)
(command «_WBLOCK» fn «» ‘(0 0) «_w» ‘(-20 -20) ‘(61 50) «»)
)
(command «_INSERT» fn ‘(50 45) «» «» «» «» «»)
(setvar «cmdecho» 1)
(princ)
)

Вставленный блок показан на рис. 2.

Рис. 2. Вставлен блок, сохраненный в файле c:/bn.dwg

После вставки блока и выполнения

(setq en (entlast))
(entget en)

получим описание блока:

((-1 . <Entity name: 7ffff705bf0>)
(0 . «INSERT») ; Тип примитива
(330 . <Entity name: 7ffff7039f0>)
(5 . «237»)
(100 . «AcDbEntity»)
(67 . 0)
(410 . «Model»)
(8 . «0») ; Слой
(100 . «AcDbBlockReference»)
(66 . 1)
(2 . «bn») ; Имя блока
(10 50.0 45.0 0.0) ; Базовая точка вставки
(41 . 1.0)
(42 . 1.0)
(43 . 1.0)
(50 . 0.0)
(70 . 0)
(71 . 0)
(44 . 0.0)
(45 . 0.0)
(210 0.0 0.0 1.0)
)

(setq en (entnext en))
(entget en)

получим описание последнего атрибута блока:

((-1 . <Entity name: 7ffff705c00>)
(0 . «ATTRIB») ; Тип примитива
(330 . <Entity name: 7ffff705bf0>) ; Родитель
(5 . «238»)
(100 . «AcDbEntity»)
(67 . 0)
(410 . «Model»)
(8 . «0»)
(100 . «AcDbText»)
(10 65.5006 69.3908 0.0)
(40 . 10.0)
(1 . «P68») ; Значение атрибута
(50 . 0.0)
(41 . 1.0)
(51 . 0.0)
(7 . «Standard»)
(71 . 0)
(72 . 4)
(11 77.929 74.326 0.0)
(210 0.0 0.0 1.0)
(100 . «AcDbAttribute»)
(280 . 0)
(2 . «AT2») ; Имя атрибута
(70 . 0)
(73 . 0)
(74 . 0)
(280 . 1)
)

(setq en (entnext en))
(entget en)

получим описание предшествующего атрибута блока (в нашем случае атрибута at1).
Выполнив вновь

(setq en (entnext en))
(entget en)

получим (в случае блока с двумя атрибутами) описание с типом примитива SEQEND:

((-1 . <Entity name: 7ffff705c20>)
(0 . «SEQEND»)
(330 . <Entity name: 7ffff705bf0>) ; Родитель
(5 . «23A»)
(100 . «AcDbEntity»)
(67 . 0) (410 . «Model»)
(8 . «0»)
(-2 . <Entity name: 7ffff705bf0>)
)

Это означает, что все атрибуты исчерпаны.
Эти наблюдения позволяют записать следующую функцию, изменяющую атрибуты блока, как это предусмотрено заданием:

(defun attrMdfr ( / ed en)
(setq en (car (entsel «Select a block:»)))
(if en
(progn
(setq ed (entget en))
(if (= (cdr (assoc 0 ed)) «INSERT»)
(while (/= (cdr (assoc 0 ed)) «SEQEND»)
(setq en (entnext en)
ed (entget en)
)
(cond ((= (cdr (assoc 2 ed)) «AT1»)
(setq ed (subst (cons 1 «R23») (assoc 1 ed) ed)) ; Value would be changed
)
((= (cdr (assoc 2 ed)) «AT2»)
(setq ed (subst (cons 70 1) (assoc 70 ed) ed)) ; Make it invisible
)
)
(entmod ed)
(entupd en)
)
(alert «Block should be selected»)
)
)
)
(princ)
)

После выполнения функции получим приведенное на рис . 3 изображение блока.

Рис. 3. Блок с программно измененными атрибутами

Замечание. Для восстановления видимости скрытого атрибута можно употребить команду ATTDISP с опцией ON.

Построение блок схем

В разделе приводятся этапы, которые следует реализовать при создании помощника для построения блок-схем вычислительных алгоритмов:

  1. Создать библиотеку элементов блок-схемы, включающую блоки:
    • Начало;
    • Следование;
    • Ветвление (Если — Тогда — КонецЕсли);
    • Ветвление (Если — Тогда — Иначе — КонецЕсли);
    • Выбор;
    • Цикл с параметром (Для k = ks По ke Шаг s Цикл — КонецЦикла);
    • Цикл Пока (Пока <ЛВ> Цикл — КонецЦикла, где ЛВ — логическое выражение);
    • Останов.
  2. Разработать правила построения блок-схем.
  3. Освоить технику построения блок-схем, отвечающих созданным правилам.
  4. Выбрать задачу для программирования, например из списка, приведенного в приложении П1, и построить, используя созданные библиотечные элементы, блок-схему алгоритма решения задачи.
  5. Написать функцию, обеспечивающую перевод блок-схемы алгоритма в его линейную схему.

Пример линейной схемы. Записать линейную схему алгоритма поиска первого четного отличного от нуля элемента одномерного массива.

  1. Начало.
  2. Ввод массива X из N элементов. Тестовый набор: N = 7; X = -1, 0, 3, 4, 9, 8, -4.
  3. Найден = ложь;
  4. Для k = 1 по N цикл
    lmnt = X[k]
    Если lmnt <> 0 и mod(lmnt, 2) = 0 Тогда
    firstEven = lmnt
    Найден = истина
    Выход из цикла;
    КонецЕсли
    КонецЦикла
  5. Если Найден Тогда
    Напечатать firstEven
    Иначе
    Напечатать «В векторе нет четных отличных от нуля элементов»
    КонецЕсли;
  6. Останов.

Заключение

Приведенные сведения могут быть полезны при создании приложений, обеспечивающих известную степень автоматизации создания рисунка и его последующей обработки. Например, создать библиотеку элементов блок-схем вычислительных алгоритмов, проработать процедуры их вставки с одновременной прорисовкой нужных связей. Также можно написать AutoLISP-код, обеспечивающий преобразование линейной схемы алгоритма в рисунок Автокада с соответствующей блок-схемой. Может быть решена и обратная задача: генерация линейной схемы по рисунку Автокада, содержащего созданную по установленным правилам блок-схему.

Sorry, you have been blocked

This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.

What can I do to resolve this?

You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.

Cloudflare Ray ID: 7c81f1d5ad38c289 • Your IP: Click to reveal 138.199.34.31 • Performance & security by Cloudflare

Добавить комментарий

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