CadQuery:通过索引选择边(填充特定边)

问题描述 投票:0回答:3

我来自工程 CAD 领域,我正在 CadQuery 中创建一些设计。我想做的是这个(伪代码):

edges = part.edges()
edges[n].fillet(r)

或者理想情况下有能力做这样的事情(尽管我找不到任何边缘属性的方法)。伪代码:

edges = part.edges()
for edge in edges:
    if edge.length() > x:
        edge.fillet(a)
    else:
        edge.fillet(b)

当设计包含非正交面时,这将非常有用。我知道我可以使用选择器选择边缘,但我发现它们不必要地复杂,并且最适合正交面。 FreeCAD 允许您将边视为列表。

我相信可能有一种方法可以选择最接近某个点的边缘,但我似乎无法找到它。

如果有人可以提供指导那就太好了——谢谢!

额外问题:有没有办法以列表或向量的形式返回几何坐标?例如:

origin = cq.workplane.center().val
>> [x,y,z]

(或者类似上面的东西)

python cad cadquery
3个回答
3
投票

为了子孙后代。选择多个边,例如。对于倒角,您可以在

newObject()
上使用
Workplane
。参数是边列表(它们必须是
cq.occ_impl.shapes.Edge
实例,而不是
cq.Workplane
实例)。

import cadquery as cq

model = cq.Workplane().box(10, 10, 5)
edges = model.edges()

# edges.all() returns worplanes, we have to get underlying geometry
selected = list(map(lambda x: x.objects[0], edges.all()))

model_with_chamfer = model.newObject(selected).chamfer(1)

要获得边长,你可以这样做:

edge = model.edges().all()[0] # This select one 'random' edge
length = edge.objects[0].Length()

edge.Length()
不起作用,因为边缘是
Workplane
实例,而不是几何实例。

要获得一定长度的边缘,您只需创建具有边缘几何形状和长度的字典,并使用内置 python 的

filter()
对其进行过滤。这是我在最上面的面上倒角短边的实现的片段:

top_edges = model.edges(">Z and #Z")

def get_length(edge):
    try:
        return edge.vals()[0].Length()
    except Exception:
        return 0.0

# Inside edges are shorter - filter only those
edge_len_list = list(map(
    lambda x: (x.objects[0], get_length(x)),
    top_edges.all()))
avg = mean([a for _, a in edge_len_list])
selected = filter(lambda x: x[1] < avg, edge_len_list)
selected = [e for e, _ in selected]

vertical_edges = model.edges("|Z").all()
selected.extend(vertical_edges)

model = model.newObject(selected)
model = model.chamfer(chamfer_size)

1
投票

看一下这段代码,希望对您有所帮助。

import cadquery as cq

plane1 = cq.Workplane()

block = plane1.rect(10,12).extrude(10)

edges = block.edges("|Z")

filleted_block = edges.all()[0].fillet(0.5)

show(filleted_block)

0
投票
base = (
    cq.Workplane("XY").box(50,60,15)
    .faces(">Z")
    .rect(30,30,forConstruction=True)
    .vertices().rect(10,5).cutBlind(until=-10)
)

edges = base.edges("|Z").all()
edges.sort( key=(lambda x: x.val().Length() ))

for ed in edges[:-4]:
    base = base.union( ed.fillet(2))
© www.soinside.com 2019 - 2024. All rights reserved.