Initial implementation of the selector grammar using PyParsing
For now the grammar is defined. It is not yet used in the StringSyntaxSelector
This commit is contained in:
parent
0ef569ab84
commit
7d7591719b
|
@ -20,6 +20,7 @@
|
||||||
import re
|
import re
|
||||||
import math
|
import math
|
||||||
from cadquery import Vector,Edge,Vertex,Face,Solid,Shell,Compound
|
from cadquery import Vector,Edge,Vertex,Face,Solid,Shell,Compound
|
||||||
|
from pyparsing import Literal,Word,nums,Optional,Combine,oneOf
|
||||||
|
|
||||||
|
|
||||||
class Selector(object):
|
class Selector(object):
|
||||||
|
@ -418,6 +419,7 @@ class InverseSelector(Selector):
|
||||||
# note that Selector() selects everything
|
# note that Selector() selects everything
|
||||||
return SubtractSelector(Selector(), self.selector).filter(objectList)
|
return SubtractSelector(Selector(), self.selector).filter(objectList)
|
||||||
|
|
||||||
|
|
||||||
class StringSyntaxSelector(Selector):
|
class StringSyntaxSelector(Selector):
|
||||||
"""
|
"""
|
||||||
Filter lists objects using a simple string syntax. All of the filters available in the string syntax
|
Filter lists objects using a simple string syntax. All of the filters available in the string syntax
|
||||||
|
@ -455,6 +457,8 @@ class StringSyntaxSelector(Selector):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def __init__(self,selectorString):
|
def __init__(self,selectorString):
|
||||||
|
|
||||||
|
self._expr = self._makeGrammar()
|
||||||
|
|
||||||
self.axes = {
|
self.axes = {
|
||||||
'X': Vector(1,0,0),
|
'X': Vector(1,0,0),
|
||||||
|
@ -486,6 +490,49 @@ class StringSyntaxSelector(Selector):
|
||||||
else:
|
else:
|
||||||
raise ValueError ("Selector String format must be [-+<>|#%] X|Y|Z ")
|
raise ValueError ("Selector String format must be [-+<>|#%] X|Y|Z ")
|
||||||
|
|
||||||
|
def _makeGrammar(self):
|
||||||
|
'''
|
||||||
|
Define the string selector grammar using PyParsing
|
||||||
|
'''
|
||||||
|
|
||||||
|
#float definition
|
||||||
|
point = Literal('.')
|
||||||
|
plusmin = Literal('+') | Literal('-')
|
||||||
|
number = Word(nums)
|
||||||
|
integer = Combine(Optional(plusmin) + number)
|
||||||
|
floatn = Combine(integer + Optional(point + Optional(number)))
|
||||||
|
|
||||||
|
#vector definition
|
||||||
|
lbracket = Literal('(')
|
||||||
|
rbracket = Literal(')')
|
||||||
|
comma = Literal(',')
|
||||||
|
vector = Combine(lbracket + floatn + comma + floatn + comma + floatn + rbracket)
|
||||||
|
|
||||||
|
#direction definition
|
||||||
|
direction = oneOf(['X','Y','Z','XY','XZ','YZ']) | vector
|
||||||
|
direction = direction.setResultsName('dir')
|
||||||
|
|
||||||
|
#CQ type definition
|
||||||
|
cqtype = oneOf(['Plane','Cylinder','Sphere','Line','Circle','Arc'])
|
||||||
|
|
||||||
|
#type operator
|
||||||
|
type_op = Literal('%')
|
||||||
|
|
||||||
|
#direction operator
|
||||||
|
direction_op = oneOf(['>','<'])
|
||||||
|
|
||||||
|
#index definition
|
||||||
|
ix_number = Optional('-')+Word(nums)
|
||||||
|
lsqbracket = Literal('[').suppress()
|
||||||
|
rsqbracket = Literal(']').suppress()
|
||||||
|
|
||||||
|
index = lsqbracket + ix_number + rsqbracket
|
||||||
|
index = index.setResultsName('index')
|
||||||
|
|
||||||
|
#other operators
|
||||||
|
other_op = oneOf(['|','#','+','-'])
|
||||||
|
|
||||||
|
return (type_op('op') + cqtype('cqtype')) | (direction_op('op') + direction + Optional(index)) | (other_op('op') + direction)
|
||||||
|
|
||||||
def _chooseSelector(self,selType,selAxis):
|
def _chooseSelector(self,selType,selAxis):
|
||||||
"""Sets up the underlying filters accordingly"""
|
"""Sets up the underlying filters accordingly"""
|
||||||
|
|
Loading…
Reference in New Issue
Block a user