Jump to content

XBuid Логический оператор AND


Recommended Posts

doodoroff

Здравствуйте !

Недавно жизнь заставила заняться написанием постпроцессора для электро-эрозионного станка. В Xbuild пишу такой код:

<IF>[and (lt(_X,0), lt(_Y,0), lt(_I,0), lt(_J,0))]<THEN>
    <32>----
<ENDIF>

Переменные _X, _Y, _I, _J - это значения соответствующих координат.

Так вот: я заметил, что в операции логического сравнения "and" участвуют только первые 2 аргумента выражения (lt(_X,0) и lt(_Y,0)), а 2 остальных игнорируются, как если бы у меня было написано:

<IF>[and (lt(_X,0), lt(_Y,0))]<THEN>
    <32>----
<ENDIF>

Строка компилируется без ошибок и в сгенерированном коде выводится результат логического выражения только для первых двух аргументов. Т. е. в строку сгенерированного кода выпадут все варианты для -X и -Y:

... ----  ---+  --+-  --++

Подскажите: это нормально ? "and" работает только с двумя аргументами, а остальные игнорятся ? Или я что-то делаю не правильно ?

 

P.S. вариант

<IF>[and (lt(<X-COORD>,0), lt(<Y-COORD>,0), lt(<ARC-X>,0), lt(<ARC-Y>,0))]<THEN>
    <32>----
<ENDIF>

пробовал - тот же результат. 

Link to post
Share on other sites


UnPinned posts
mannul

@doodoroff Логическое И не обрабатывает все что справа если натыкается на ложь.

У вас видимо Y>0 или Y=0, на этом все и заканчивается.

Edited by mannul
Link to post
Share on other sites
doodoroff

<IF>[and (lt(_X,0), lt(_Y,0), lt(_I,0), lt(_J,0))]<THEN>
    <32>----
<ENDIF>

На сколько я понимаю в этом коде должна реализовываться следующая логика:

ЕСЛИ у всех 4 аргументов логического выражения and значение="истина", то вывести "----". Если Y>0 или Y=0, то and возвращает "ложь" и оператор IF не выполняется, т.е. не выводится ничего.

А у меня два последних аргумента вообще игнорируются с любыми значениями.

Вот фрагмент кода:

<IF>[and (lt(_X,0), lt(_Y,0), lt(_I,0), lt(_J,0))]<THEN> //1
	<32>----
<ENDIF>
<IF>[and (lt(_X,0), lt(_Y,0), lt(_I,0), ge(_J,0))]<THEN> //2
	<32>---+
<ENDIF>
<IF>[and (lt(_X,0), lt(_Y,0), ge(_I,0), lt(_J,0))]<THEN> //3
	<32>--+-
<ENDIF>
<IF>[and (lt(_X,0), lt(_Y,0), ge(_I,0), ge(_J,0))]<THEN> //4
	<32>--++
<ENDIF>
<IF>[and (lt(_X,0), ge(_Y,0), lt(_I,0), lt(_J,0))]<THEN> //5
	<32>-+--
<ENDIF>
<IF>[and (lt(_X,0), ge(_Y,0), lt(_I,0), ge(_J,0))]<THEN> //6
	<32>-+-+
<ENDIF>
<IF>[and (lt(_X,0), ge(_Y,0), ge(_I,0), lt(_J,0))]<THEN> //7
	<32>-++-
<ENDIF>
<IF>[and (lt(_X,0), ge(_Y,0), ge(_I,0), ge(_J,0))]<THEN> //8
	<32>-+++
<ENDIF>
<IF>[and (ge(_X,0), lt(_Y,0), lt(_I,0), lt(_J,0))]<THEN> //9
	<32>+---
<ENDIF>
<IF>[and (ge(_X,0), lt(_Y,0), lt(_I,0), ge(_J,0))]<THEN> //10
	<32>+--+
<ENDIF>
<IF>[and (ge(_X,0), lt(_Y,0), ge(_I,0), lt(_J,0))]<THEN> //11
	<32>+-+-
<ENDIF>
<IF>[and (ge(_X,0), lt(_Y,0), ge(_I,0), ge(_J,0))]<THEN> //12
	<32>+-++
<ENDIF>
<IF>[and (ge(_X,0), ge(_Y,0), lt(_I,0), lt(_J,0))]<THEN> //13
	<32>++--
<ENDIF>
<IF>[and (ge(_X,0), ge(_Y,0), lt(_I,0), ge(_J,0))]<THEN> //14
	<32>++-+
<ENDIF>
<IF>[and (ge(_X,0), ge(_Y,0), ge(_I,0), lt(_J,0))]<THEN> //15
	<32>+++-
<ENDIF>
<IF>[and (ge(_X,0), ge(_Y,0), ge(_I,0), ge(_J,0))]<THEN> //16
	<32>++++
<ENDIF>

Вот пример:

R2yzR7c

В примере должен выводиться только текст в красной рамке

Вопрос тот же: AND в XBuild может обрабатывать больше 2-х аргументов ? Или я что-то не правильно делаю ?

3 минуты назад, doodoroff сказал:

<IF>[and (lt(_X,0), lt(_Y,0), lt(_I,0), lt(_J,0))]<THEN>
    <32>----
<ENDIF>

На сколько я понимаю в этом коде должна реализовываться следующая логика:

ЕСЛИ у всех 4 аргументов логического выражения and значение="истина", то вывести "----". Если Y>0 или Y=0, то and возвращает "ложь" и оператор IF не выполняется, т.е. не выводится ничего.

А у меня два последних аргумента вообще игнорируются с любыми значениями.

Вот фрагмент кода:


<IF>[and (lt(_X,0), lt(_Y,0), lt(_I,0), lt(_J,0))]<THEN> //1
	<32>----
<ENDIF>
<IF>[and (lt(_X,0), lt(_Y,0), lt(_I,0), ge(_J,0))]<THEN> //2
	<32>---+
<ENDIF>
<IF>[and (lt(_X,0), lt(_Y,0), ge(_I,0), lt(_J,0))]<THEN> //3
	<32>--+-
<ENDIF>
<IF>[and (lt(_X,0), lt(_Y,0), ge(_I,0), ge(_J,0))]<THEN> //4
	<32>--++
<ENDIF>
<IF>[and (lt(_X,0), ge(_Y,0), lt(_I,0), lt(_J,0))]<THEN> //5
	<32>-+--
<ENDIF>
<IF>[and (lt(_X,0), ge(_Y,0), lt(_I,0), ge(_J,0))]<THEN> //6
	<32>-+-+
<ENDIF>
<IF>[and (lt(_X,0), ge(_Y,0), ge(_I,0), lt(_J,0))]<THEN> //7
	<32>-++-
<ENDIF>
<IF>[and (lt(_X,0), ge(_Y,0), ge(_I,0), ge(_J,0))]<THEN> //8
	<32>-+++
<ENDIF>
<IF>[and (ge(_X,0), lt(_Y,0), lt(_I,0), lt(_J,0))]<THEN> //9
	<32>+---
<ENDIF>
<IF>[and (ge(_X,0), lt(_Y,0), lt(_I,0), ge(_J,0))]<THEN> //10
	<32>+--+
<ENDIF>
<IF>[and (ge(_X,0), lt(_Y,0), ge(_I,0), lt(_J,0))]<THEN> //11
	<32>+-+-
<ENDIF>
<IF>[and (ge(_X,0), lt(_Y,0), ge(_I,0), ge(_J,0))]<THEN> //12
	<32>+-++
<ENDIF>
<IF>[and (ge(_X,0), ge(_Y,0), lt(_I,0), lt(_J,0))]<THEN> //13
	<32>++--
<ENDIF>
<IF>[and (ge(_X,0), ge(_Y,0), lt(_I,0), ge(_J,0))]<THEN> //14
	<32>++-+
<ENDIF>
<IF>[and (ge(_X,0), ge(_Y,0), ge(_I,0), lt(_J,0))]<THEN> //15
	<32>+++-
<ENDIF>
<IF>[and (ge(_X,0), ge(_Y,0), ge(_I,0), ge(_J,0))]<THEN> //16
	<32>++++
<ENDIF>

Вот пример:

R2yzR7c

В примере должен выводиться только текст в красной рамке

Вопрос тот же: AND в XBuild может обрабатывать больше 2-х аргументов ? Или я что-то не правильно делаю ?

Вот ссылка на картинку с примером

https://ibb.co/R2yzR7c

Link to post
Share on other sites
mannul

@doodoroff Было бы гораздо проще, если бы вы прикрепили проект, пост и написали что хотите сделать.

По вашей картинке выводит вообще всё.

Link to post
Share on other sites
2 часа назад, doodoroff сказал:

Вопрос тот же: AND в XBuild может обрабатывать больше 2-х аргументов ?

 

Нет. По-моему, требуемое реализуется просто:

<32>
<IF>[lt(<X-COORD>,0)]<THEN>-<ELSE>+<ENDIF>
<IF>[lt(<Y-COORD>,0)]<THEN>-<ELSE>+<ENDIF>
<IF>[lt(<ARC-X>,0)]<THEN>-<ELSE>+<ENDIF>
<IF>[lt(<ARC-Y>,0)]<THEN>-<ELSE>+<ENDIF>
<EOB>

 

  • Нравится 1
Link to post
Share on other sites
doodoroff
6 часов назад, mannul сказал:

@doodoroff Было бы гораздо проще, если бы вы прикрепили проект, пост и написали что хотите сделать.

По вашей картинке выводит вообще всё.

Ну я, наверно, вопрос сформулировал избыточно сложно. Я узнать хотел у опытных разработчиков, может ли and обрабатывать больше 2-х аргументов.

 

5 часов назад, Helg сказал:

Нет. По-моему, требуемое реализуется просто:


<32>
<IF>[lt(<X-COORD>,0)]<THEN>-<ELSE>+<ENDIF>
<IF>[lt(<Y-COORD>,0)]<THEN>-<ELSE>+<ENDIF>
<IF>[lt(<ARC-X>,0)]<THEN>-<ELSE>+<ENDIF>
<IF>[lt(<ARC-Y>,0)]<THEN>-<ELSE>+<ENDIF>
<EOB>

 

Спасибо !

Link to post
Share on other sites
  • 4 weeks later...
Greenston
05.01.2021 в 06:49, doodoroff сказал:

Ну я, наверно, вопрос сформулировал избыточно сложно. Я узнать хотел у опытных разработчиков, может ли and обрабатывать больше 2-х аргументов.

 

Спасибо !

Добрый день! Операторы and, or и подобные не умеют использовать более 2 аргументов. Проверено! Разработчики как-то подтверждали.

Пример обхода этой ситуации есть - делайте побольше круглых скобок и сравнивайте парами. Сложнее, но только так работает. Вот:

<IF>[and(and(apxeq(<ABS-SHIFTX>,0),apxeq(<ABS-SHIFTY>,0)),apxeq(<ABS-SHIFTZ>,0))]<THEN>

Edited by Greenston
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.



×
×
  • Create New...