jerboapy 0.2rc332__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
jerboapy_ext/rules.py ADDED
@@ -0,0 +1,603 @@
1
+ from jerboapy import *
2
+
3
+ from .utils import *
4
+ from .Point3 import Point3
5
+ from .Color4 import Color4
6
+
7
+
8
+
9
+ def rule_duplication_Duplicate():
10
+ def fun_n1_pos(context):
11
+ return context.gmap[context.leftdart].ebd123["pos"]
12
+ def fun_n1_color(context):
13
+ return context.gmap[context.leftdart].ebd01["color"]
14
+ def fun_n1_orient(context):
15
+ return context.gmap[context.leftdart].ebd["orient"]
16
+ def fun_n1_normal(context):
17
+ return context.gmap[context.leftdart].ebd01["normal"]
18
+
19
+ expr_n1_pos = Expr3DEbd123("pos",fun_n1_pos)
20
+ expr_n1_color = Expr3DEbd01("color",fun_n1_color)
21
+ expr_n1_orient = Expr3DEbdDart("orient",fun_n1_orient)
22
+ expr_n1_normal = Expr3DEbd01("normal",fun_n1_normal)
23
+ rule = Rule3D("Duplicate","duplication")
24
+ # motif gauche
25
+ ln0 = rule.make_leftnode("n0", [0,1,2,3], True)
26
+ # motif droit
27
+ rn0 = rule.make_rightnode("n0", [0,1,2,3])
28
+ rn1 = rule.make_rightnode("n1", [0,1,2,3],[expr_n1_pos,expr_n1_color,expr_n1_orient,expr_n1_normal])
29
+ rule.compile()
30
+ return rule
31
+
32
+ def rule_creat_CreatSquare():
33
+ def fun_n0_pos(context):
34
+ return Point3(0,0,0)
35
+ def fun_n0_color(context):
36
+ return Color4.randomColor()
37
+ def fun_n0_orient(context):
38
+ return True
39
+ def fun_n0_normal(context):
40
+ return Point3(0,1,0)
41
+ def fun_n1_pos(context):
42
+ return Point3(1,0,0)
43
+ def fun_n1_orient(context):
44
+ return False
45
+ def fun_n2_orient(context):
46
+ return True
47
+ def fun_n3_pos(context):
48
+ return Point3(1,0,1)
49
+ def fun_n3_orient(context):
50
+ return False
51
+ def fun_n4_orient(context):
52
+ return True
53
+ def fun_n5_pos(context):
54
+ return Point3(0,0,1)
55
+ def fun_n5_orient(context):
56
+ return False
57
+ def fun_n6_orient(context):
58
+ return True
59
+ def fun_n7_orient(context):
60
+ return False
61
+ expr_n0_pos = Expr3DEbd123("pos",fun_n0_pos)
62
+ expr_n0_color = Expr3DEbd01("color",fun_n0_color)
63
+ expr_n0_orient = Expr3DEbdDart("orient",fun_n0_orient)
64
+ expr_n0_normal = Expr3DEbd01("normal",fun_n0_normal)
65
+ expr_n1_pos = Expr3DEbd123("pos",fun_n1_pos)
66
+ expr_n1_orient = Expr3DEbdDart("orient",fun_n1_orient)
67
+ expr_n2_orient = Expr3DEbdDart("orient",fun_n2_orient)
68
+ expr_n3_pos = Expr3DEbd123("pos",fun_n3_pos)
69
+ expr_n3_orient = Expr3DEbdDart("orient",fun_n3_orient)
70
+ expr_n4_orient = Expr3DEbdDart("orient",fun_n4_orient)
71
+ expr_n5_pos = Expr3DEbd123("pos",fun_n5_pos)
72
+ expr_n5_orient = Expr3DEbdDart("orient",fun_n5_orient)
73
+ expr_n6_orient = Expr3DEbdDart("orient",fun_n6_orient)
74
+ expr_n7_orient = Expr3DEbdDart("orient",fun_n7_orient)
75
+ rule = Rule3D("CreatSquare","creat")
76
+ # motif gauche
77
+ # motif droit
78
+ rn0 = rule.make_rightnode("n0", [],[expr_n0_pos,expr_n0_color,expr_n0_orient,expr_n0_normal])
79
+ rn1 = rule.make_rightnode("n1", [],[expr_n1_pos,expr_n1_orient,expr_n0_normal,expr_n0_color])
80
+ rn2 = rule.make_rightnode("n2", [],[expr_n2_orient,expr_n1_pos,expr_n0_normal,expr_n0_color])
81
+ rn3 = rule.make_rightnode("n3", [],[expr_n3_pos,expr_n3_orient,expr_n0_normal,expr_n0_color])
82
+ rn4 = rule.make_rightnode("n4", [],[expr_n4_orient,expr_n3_pos,expr_n0_normal,expr_n0_color])
83
+ rn5 = rule.make_rightnode("n5", [],[expr_n5_pos,expr_n5_orient,expr_n0_normal,expr_n0_color])
84
+ rn6 = rule.make_rightnode("n6", [],[expr_n6_orient,expr_n5_pos,expr_n0_normal,expr_n0_color])
85
+ rn7 = rule.make_rightnode("n7", [],[expr_n7_orient,expr_n0_pos,expr_n0_normal,expr_n0_color])
86
+ rule.linkRightNodes(0,rn0,rn1)
87
+ rule.linkRightNodes(1,rn1,rn2)
88
+ rule.linkRightNodes(0,rn2,rn3)
89
+ rule.linkRightNodes(1,rn3,rn4)
90
+ rule.linkRightNodes(0,rn4,rn5)
91
+ rule.linkRightNodes(1,rn5,rn6)
92
+ rule.linkRightNodes(0,rn6,rn7)
93
+ rule.linkRightNodes(1,rn7,rn0)
94
+ rule.linkRightNodes(2,rn0,rn0)
95
+ rule.linkRightNodes(3,rn0,rn0)
96
+ rule.linkRightNodes(2,rn1,rn1)
97
+ rule.linkRightNodes(3,rn1,rn1)
98
+ rule.linkRightNodes(2,rn2,rn2)
99
+ rule.linkRightNodes(3,rn2,rn2)
100
+ rule.linkRightNodes(2,rn3,rn3)
101
+ rule.linkRightNodes(3,rn3,rn3)
102
+ rule.linkRightNodes(2,rn4,rn4)
103
+ rule.linkRightNodes(3,rn4,rn4)
104
+ rule.linkRightNodes(2,rn5,rn5)
105
+ rule.linkRightNodes(3,rn5,rn5)
106
+ rule.linkRightNodes(2,rn6,rn6)
107
+ rule.linkRightNodes(3,rn6,rn6)
108
+ rule.linkRightNodes(2,rn7,rn7)
109
+ rule.linkRightNodes(3,rn7,rn7)
110
+ rule.compile()
111
+ return rule
112
+
113
+ def rule_sew_SewA0():
114
+ rule = Rule3D("SewA0","sew")
115
+ # motif gauche
116
+ ln0 = rule.make_leftnode("n0", [2,3], True)
117
+ ln1 = rule.make_leftnode("n1", [2,3], True)
118
+ # motif droit
119
+ rn0 = rule.make_rightnode("n0", [2,3])
120
+ rn1 = rule.make_rightnode("n1", [2,3])
121
+ rule.linkRightNodes(0,rn0,rn1)
122
+ rule.compile()
123
+ return rule
124
+
125
+ def rule_sew_SewA1():
126
+ rule = Rule3D("SewA1","sew")
127
+ # motif gauche
128
+ ln0 = rule.make_leftnode("n0", [3], True)
129
+ ln1 = rule.make_leftnode("n1", [3], True)
130
+ rule.linkLeftNodes(1,ln0,ln0)
131
+ rule.linkLeftNodes(1,ln1,ln1)
132
+ # motif droit
133
+ rn0 = rule.make_rightnode("n0", [3])
134
+ rn1 = rule.make_rightnode("n1", [3])
135
+ rule.linkRightNodes(1,rn0,rn1)
136
+ rule.compile()
137
+ return rule
138
+
139
+ def rule_sew_SewA2():
140
+ rule = Rule3D("SewA2","sew")
141
+ # motif gauche
142
+ ln0 = rule.make_leftnode("n0", [0], True)
143
+ ln1 = rule.make_leftnode("n1", [0], True)
144
+ rule.linkLeftNodes(2,ln0,ln0)
145
+ rule.linkLeftNodes(2,ln1,ln1)
146
+ # motif droit
147
+ rn0 = rule.make_rightnode("n0", [0])
148
+ rn1 = rule.make_rightnode("n1", [0])
149
+ rule.linkRightNodes(2,rn0,rn1)
150
+ rule.compile()
151
+ return rule
152
+
153
+ def rule_sew_SewA3():
154
+ rule = Rule3D("SewA3","sew")
155
+ # motif gauche
156
+ ln0 = rule.make_leftnode("n0", [0,1], True)
157
+ ln1 = rule.make_leftnode("n1", [0,1], True)
158
+ rule.linkLeftNodes(3,ln0,ln0)
159
+ rule.linkLeftNodes(3,ln1,ln1)
160
+ # motif droit
161
+ rn0 = rule.make_rightnode("n0", [0,1])
162
+ rn1 = rule.make_rightnode("n1", [0,1])
163
+ rule.linkRightNodes(3,rn0,rn1)
164
+ rule.compile()
165
+ return rule
166
+
167
+ def rule_sew_UnSewA0():
168
+ rule = Rule3D("UnSewA0","sew")
169
+ # motif gauche
170
+ ln0 = rule.make_leftnode("n0", [2,3], True)
171
+ ln1 = rule.make_leftnode("n1", [2,3])
172
+ rule.linkLeftNodes(0,ln0,ln1)
173
+ # motif droit
174
+ rn0 = rule.make_rightnode("n0", [2,3])
175
+ rn1 = rule.make_rightnode("n1", [2,3])
176
+ rule.linkRightNodes(0,rn1,rn1)
177
+ rule.linkRightNodes(0,rn0,rn0)
178
+ rule.compile()
179
+ return rule
180
+
181
+ def rule_sew_UnSewA1():
182
+ rule = Rule3D("UnSewA1","sew")
183
+ # motif gauche
184
+ ln0 = rule.make_leftnode("n0", [3], True)
185
+ ln1 = rule.make_leftnode("n1", [3])
186
+ rule.linkLeftNodes(1,ln0,ln1)
187
+ # motif droit
188
+ rn0 = rule.make_rightnode("n0", [3])
189
+ rn1 = rule.make_rightnode("n1", [3])
190
+ rule.linkRightNodes(1,rn0,rn0)
191
+ rule.linkRightNodes(1,rn1,rn1)
192
+ rule.compile()
193
+ return rule
194
+
195
+ def rule_sew_UnSewA2():
196
+ rule = Rule3D("UnSewA2","sew")
197
+ # motif gauche
198
+ ln0 = rule.make_leftnode("n0", [0], True)
199
+ ln1 = rule.make_leftnode("n1", [0])
200
+ rule.linkLeftNodes(2,ln0,ln1)
201
+ # motif droit
202
+ rn0 = rule.make_rightnode("n0", [0])
203
+ rn1 = rule.make_rightnode("n1", [0])
204
+ rule.linkRightNodes(2,rn0,rn0)
205
+ rule.linkRightNodes(2,rn1,rn1)
206
+ rule.compile()
207
+ return rule
208
+
209
+ def rule_sew_UnSewA3():
210
+ rule = Rule3D("UnSewA3","sew")
211
+ # motif gauche
212
+ ln0 = rule.make_leftnode("n0", [0,1], True)
213
+ ln1 = rule.make_leftnode("n1", [0,1])
214
+ rule.linkLeftNodes(3,ln0,ln1)
215
+ # motif droit
216
+ rn0 = rule.make_rightnode("n0", [0,1])
217
+ rn1 = rule.make_rightnode("n1", [0,1])
218
+ rule.linkRightNodes(3,rn1,rn1)
219
+ rule.linkRightNodes(3,rn0,rn0)
220
+ rule.compile()
221
+ return rule
222
+
223
+
224
+
225
+
226
+ def rule_subdivision_DooSabin3D():
227
+ def fun_n0_pos(context):
228
+ points = collect123([0,1,2], context.gmap, context.leftdart, "pos", Point3(0,0,0))
229
+ centerFace = Point3.middle(points)
230
+ res = Point3.middle(centerFace, context.gmap[context.leftdart].ebd123["pos"])
231
+ return res
232
+ def fun_n1_color(context):
233
+ return Color4.randomColor()
234
+ def fun_n1_orient(context):
235
+ return not context.gmap[context.leftdart].ebd["orient"]
236
+ def fun_n2_orient(context):
237
+ return context.gmap[context.leftdart].ebd["orient"]
238
+ def fun_n2_normal(context):
239
+ vec = Point3()
240
+ vec.add(context.gmap[context.leftdart].ebd01["normal"])
241
+ voisin = context.gmap[context.leftdart].alpha(2)
242
+ vec.add(context.gmap[voisin].ebd01["normal"])
243
+ vec.normalize()
244
+ return vec
245
+ def fun_n3_color(context):
246
+ return Color4.randomColor()
247
+ def fun_n3_orient(context):
248
+ return not context.gmap[context.leftdart].ebd["orient"]
249
+ def fun_n3_normal(context):
250
+ normals = collect01([1,2,3], context.gmap, context.leftdart, "normal", Point3(0,0,0))
251
+ resnorm = Point3.sum(normals)
252
+ resnorm.normalize()
253
+ return resnorm
254
+ expr_n0_pos = Expr3DEbd123("pos",fun_n0_pos)
255
+ expr_n1_color = Expr3DEbd01("color",fun_n1_color)
256
+ expr_n1_orient = Expr3DEbdDart("orient",fun_n1_orient)
257
+ expr_n2_orient = Expr3DEbdDart("orient",fun_n2_orient)
258
+ expr_n2_normal = Expr3DEbd01("normal",fun_n2_normal)
259
+ expr_n3_color = Expr3DEbd01("color",fun_n3_color)
260
+ expr_n3_orient = Expr3DEbdDart("orient",fun_n3_orient)
261
+ expr_n3_normal = Expr3DEbd01("normal",fun_n3_normal)
262
+ rule = Rule3D("DooSabin3D","subdivision")
263
+ # motif gauche
264
+ ln0 = rule.make_leftnode("n0", [0,1,2,3], True)
265
+ # motif droit
266
+ rn0 = rule.make_rightnode("n0", [0,1,-1,3],[expr_n0_pos])
267
+ rn1 = rule.make_rightnode("n1", [0,-1,-1,-1],[expr_n1_color,expr_n1_orient,expr_n0_pos,expr_n2_normal])
268
+ rn2 = rule.make_rightnode("n2", [-1,-1,0,-1],[expr_n2_orient,expr_n2_normal,expr_n0_pos,expr_n1_color])
269
+ rn3 = rule.make_rightnode("n3", [-1,1,0,-1],[expr_n3_color,expr_n3_orient,expr_n3_normal,expr_n0_pos])
270
+ rule.linkRightNodes(2,rn0,rn1)
271
+ rule.linkRightNodes(1,rn1,rn2)
272
+ rule.linkRightNodes(2,rn2,rn3)
273
+ rule.linkRightNodes(3,rn1,rn1)
274
+ rule.linkRightNodes(3,rn2,rn2)
275
+ rule.linkRightNodes(3,rn3,rn3)
276
+ rule.compile()
277
+ return rule
278
+
279
+ def rule_subdivision_Menger3D_casse():
280
+ def fun_n1_orient(context):
281
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
282
+ def fun_n1_pos(context):
283
+ print(">>> fun_n1_pos ", context.leftdart)
284
+ voisin = context.leftdart.alpha(0)
285
+ return Point3.linear(context.leftdart.ebd123["pos"], voisin.ebd123["pos"], 1.0/3.0)
286
+ def fun_n2_orient(context):
287
+ return context.gmap[context.leftdart].ebd.get("orient", True)
288
+ def fun_n3_orient(context):
289
+ return context.gmap[context.leftdart].ebd.get("orient", True)
290
+ def fun_n4_orient(context):
291
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
292
+ def fun_n4_normal(context):
293
+ voisin = context.gmap.path(context.leftdart, [1,2])
294
+ resnorm = context.gmap[voisin].ebd.get("normal", Point3(0,0,1))
295
+ resnorm.scale(-1.0)
296
+ return resnorm
297
+ def fun_n5_orient(context):
298
+ return context.gmap[context.leftdart].ebd.get("orient", True)
299
+ def fun_n5_normal(context):
300
+ voisin = context.gmap.path(context.leftdart, [1,2])
301
+ resnorm = context.gmap[voisin].ebd.get("normal", Point3(0,0,1))
302
+ return resnorm
303
+
304
+ def fun_n6_orient(context):
305
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
306
+ def fun_n6_normal(context):
307
+ return context.gmap[context.leftdart].ebd01["normal"]
308
+ def fun_n7_orient(context):
309
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
310
+ def fun_n7_pos(context):
311
+ n0a0 = context.gmap[context.leftdart].alpha(0)
312
+ a = context.gmap[n0a0].ebd123["pos"].sub(context.gmap[context.leftdart].ebd123["pos"])
313
+ n0a1a0 = context.gmap.path(context.leftdart, [1,0])
314
+ b = context.gmap[n0a1a0].ebd123["pos"].sub(context.gmap[context.leftdart].ebd123["pos"])
315
+ a.add(b)
316
+ a.scale(1.0/3.0)
317
+ a.add(context.gmap[context.leftdart].ebd123["pos"])
318
+ return a
319
+ def fun_n8_orient(context):
320
+ return context.gmap[context.leftdart].ebd.get("orient", True)
321
+ def fun_n9_orient(context):
322
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
323
+ def fun_n10_orient(context):
324
+ return context.gmap[context.leftdart].ebd.get("orient", True)
325
+ def fun_n11_orient(context):
326
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
327
+ def fun_n12_orient(context):
328
+ return context.gmap[context.leftdart].ebd.get("orient", True)
329
+ def fun_n12_normal(context):
330
+ n0a2 = context.gmap[context.leftdart].alpha(2)
331
+ # print(">>> n0a2 : ", n0a2)
332
+ resnorm = context.gmap[n0a2].ebd01["normal"]
333
+ # print(">>> resnorm : ", resnorm)
334
+ # resnorm.scale(-1.0) # ENCORE UN PROBLEME PAS COMPRIS
335
+ return resnorm
336
+ def fun_n13_orient(context):
337
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
338
+ def fun_n14_orient(context):
339
+ return context.gmap[context.leftdart].ebd.get("orient", True)
340
+ def fun_n15_orient(context):
341
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
342
+ def fun_n16_orient(context):
343
+ return context.gmap[context.leftdart].ebd.get("orient", True)
344
+ def fun_n17_orient(context):
345
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
346
+ def fun_n18_orient(context):
347
+ return context.gmap[context.leftdart].ebd.get("orient", True)
348
+ def fun_n19_orient(context):
349
+ return not context.gmap[context.leftdart].ebd.get("orient", True)
350
+ def fun_n19_pos(context):
351
+ n0a0 = context.gmap[context.leftdart].alpha(0)
352
+ n0a1a0 = context.gmap.path(context.leftdart, [1,0])
353
+ n0a2a1a0 = context.gmap.path(context.leftdart, [2,1,0])
354
+ a = Point3(context.gmap[context.leftdart].ebd123["pos"], context.gmap[n0a0].ebd123["pos"])
355
+ b = Point3(context.gmap[context.leftdart].ebd123["pos"], context.gmap[n0a1a0].ebd123["pos"])
356
+ c = Point3(context.gmap[context.leftdart].ebd123["pos"], context.gmap[n0a2a1a0].ebd123["pos"])
357
+ a.add(b)
358
+ a.add(c)
359
+ a.scale(1.0/3.0)
360
+ a.add(context.gmap[context.leftdart].ebd123["pos"])
361
+
362
+ return a
363
+
364
+ expr_n1_orient = Expr3DEbdDart("orient",fun_n1_orient)
365
+ expr_n1_pos = Expr3DEbd123("pos",fun_n1_pos)
366
+ expr_n2_orient = Expr3DEbdDart("orient",fun_n2_orient)
367
+ expr_n3_orient = Expr3DEbdDart("orient",fun_n3_orient)
368
+ expr_n4_orient = Expr3DEbdDart("orient",fun_n4_orient)
369
+ expr_n4_normal = Expr3DEbd01("normal",fun_n4_normal)
370
+ expr_n5_orient = Expr3DEbdDart("orient",fun_n5_orient)
371
+ expr_n5_normal = Expr3DEbd01("normal",fun_n5_normal)
372
+ expr_n6_orient = Expr3DEbdDart("orient",fun_n6_orient)
373
+ expr_n6_normal = Expr3DEbd01("normal",fun_n6_normal)
374
+ expr_n7_orient = Expr3DEbdDart("orient",fun_n7_orient)
375
+ expr_n7_pos = Expr3DEbd123("pos",fun_n7_pos)
376
+ expr_n8_orient = Expr3DEbdDart("orient",fun_n8_orient)
377
+ expr_n9_orient = Expr3DEbdDart("orient",fun_n9_orient)
378
+ expr_n10_orient = Expr3DEbdDart("orient",fun_n10_orient)
379
+ expr_n11_orient = Expr3DEbdDart("orient",fun_n11_orient)
380
+ expr_n12_orient = Expr3DEbdDart("orient",fun_n12_orient)
381
+ expr_n12_normal = Expr3DEbd01("normal",fun_n12_normal)
382
+ expr_n13_orient = Expr3DEbdDart("orient",fun_n13_orient)
383
+ expr_n14_orient = Expr3DEbdDart("orient",fun_n14_orient)
384
+ expr_n15_orient = Expr3DEbdDart("orient",fun_n15_orient)
385
+ expr_n16_orient = Expr3DEbdDart("orient",fun_n16_orient)
386
+ expr_n17_orient = Expr3DEbdDart("orient",fun_n17_orient)
387
+ expr_n18_orient = Expr3DEbdDart("orient",fun_n18_orient)
388
+ expr_n19_orient = Expr3DEbdDart("orient",fun_n19_orient)
389
+ expr_n19_pos = Expr3DEbd123("pos",fun_n19_pos)
390
+ rule = Rule3D("Menger3D","subdivision")
391
+ # motif gauche
392
+ ln0 = rule.make_leftnode("n0", [0,1,2,3], True)
393
+ # motif droit
394
+ rn0 = rule.make_rightnode("n0", [-1,1,2,3])
395
+ rn1 = rule.make_rightnode("n1", [-1,-1,2,3],[expr_n1_orient,expr_n1_pos])
396
+ rn2 = rule.make_rightnode("n2", [0,-1,2,3],[expr_n2_orient,expr_n1_pos,expr_n6_normal])
397
+ rn3 = rule.make_rightnode("n3", [-1,-1,-1,3],[expr_n3_orient,expr_n1_pos])
398
+ rn4 = rule.make_rightnode("n4", [-1,-1,1,-1],[expr_n4_orient,expr_n4_normal,expr_n1_pos])
399
+ rn5 = rule.make_rightnode("n5", [-1,-1,1,-1],[expr_n5_orient,expr_n5_normal,expr_n1_pos])
400
+ rn6 = rule.make_rightnode("n6", [-1,-1,-1,3],[expr_n6_orient,expr_n6_normal,expr_n1_pos])
401
+ rn7 = rule.make_rightnode("n7", [-1,1,-1,3],[expr_n7_orient,expr_n7_pos])
402
+ rn8 = rule.make_rightnode("n8", [-1,-1,-1,-1],[expr_n8_orient,expr_n7_pos,expr_n4_normal])
403
+ rn9 = rule.make_rightnode("n9", [-1,-1,-1,-1],[expr_n9_orient,expr_n7_pos,expr_n5_normal])
404
+ rn10 = rule.make_rightnode("n10", [-1,-1,-1,3],[expr_n10_orient,expr_n7_pos,expr_n6_normal])
405
+ rn11 = rule.make_rightnode("n11", [0,-1,-1,3],[expr_n11_orient,expr_n7_pos,expr_n6_normal])
406
+ rn12 = rule.make_rightnode("n12", [0,-1,-1,-1],[expr_n12_orient,expr_n12_normal,expr_n7_pos])
407
+ rn13 = rule.make_rightnode("n13", [-1,2,-1,-1],[expr_n13_orient,expr_n7_pos,expr_n4_normal])
408
+ rn14 = rule.make_rightnode("n14", [-1,-1,-1,-1],[expr_n14_orient,expr_n7_pos,expr_n5_normal])
409
+ rn15 = rule.make_rightnode("n15", [-1,-1,-1,-1],[expr_n15_orient,expr_n7_pos,expr_n12_normal])
410
+ rn16 = rule.make_rightnode("n16", [-1,2,1,-1],[expr_n16_orient,expr_n19_pos,expr_n4_normal])
411
+ rn17 = rule.make_rightnode("n17", [-1,-1,1,-1],[expr_n17_orient,expr_n19_pos,expr_n5_normal])
412
+ rn18 = rule.make_rightnode("n18", [-1,-1,-1,-1],[expr_n18_orient,expr_n19_pos,expr_n12_normal])
413
+ rn19 = rule.make_rightnode("n19", [0,-1,2,-1],[expr_n19_orient,expr_n19_pos,expr_n12_normal])
414
+ rule.linkRightNodes(0,rn0,rn1)
415
+ rule.linkRightNodes(1,rn1,rn3)
416
+ rule.linkRightNodes(0,rn3,rn7)
417
+ rule.linkRightNodes(2,rn3,rn4)
418
+ rule.linkRightNodes(2,rn7,rn8)
419
+ rule.linkRightNodes(0,rn4,rn8)
420
+ rule.linkRightNodes(0,rn5,rn9)
421
+ rule.linkRightNodes(0,rn6,rn10)
422
+ rule.linkRightNodes(1,rn8,rn13)
423
+ rule.linkRightNodes(1,rn9,rn14)
424
+ rule.linkRightNodes(1,rn2,rn6)
425
+ rule.linkRightNodes(2,rn6,rn5)
426
+ rule.linkRightNodes(1,rn10,rn11)
427
+ rule.linkRightNodes(2,rn11,rn12)
428
+ rule.linkRightNodes(0,rn15,rn18)
429
+ rule.linkRightNodes(0,rn14,rn17)
430
+ rule.linkRightNodes(0,rn13,rn16)
431
+ rule.linkRightNodes(1,rn15,rn12)
432
+ rule.linkRightNodes(2,rn14,rn15)
433
+ rule.linkRightNodes(2,rn17,rn18)
434
+ rule.linkRightNodes(3,rn14,rn13)
435
+ rule.linkRightNodes(3,rn17,rn16)
436
+ rule.linkRightNodes(3,rn8,rn9)
437
+ rule.linkRightNodes(3,rn5,rn4)
438
+ rule.linkRightNodes(2,rn9,rn10)
439
+ rule.linkRightNodes(1,rn18,rn19)
440
+ rule.linkRightNodes(3,rn19,rn19)
441
+ rule.linkRightNodes(3,rn18,rn18)
442
+ rule.linkRightNodes(3,rn15,rn15)
443
+ rule.linkRightNodes(3,rn12,rn12)
444
+ rule.compile()
445
+ return rule
446
+
447
+
448
+ def rule_subdivision_Menger3D():
449
+ def fun_nX_color(context):
450
+ return context.leftdart.ebd01.get("color", Color4.GRAY)
451
+ def fun_n1_pos(context):
452
+ voisin = context.gmap[context.leftdart].alpha(0)
453
+ return Point3.linear(context.gmap[context.leftdart].ebd123["pos"], context.gmap[voisin].ebd123["pos"], 1.0/3.0)
454
+ def fun_n7_pos(context):
455
+ n0a0 = context.gmap[context.leftdart].alpha(0)
456
+ a = context.gmap[n0a0].ebd123["pos"].sub(context.gmap[context.leftdart].ebd123["pos"])
457
+ n0a1a0 = context.gmap.path(context.leftdart, [1,0])
458
+ b = context.gmap[n0a1a0].ebd123["pos"].sub(context.gmap[context.leftdart].ebd123["pos"])
459
+ a = a.add(b)
460
+ a = a.scale(1.0/3.0)
461
+ a = a.add(context.gmap[context.leftdart].ebd123["pos"])
462
+ return a
463
+ def fun_n19_pos(context):
464
+ n0a0 = context.gmap[context.leftdart].alpha(0)
465
+ n0a1a0 = context.gmap.path(context.leftdart, [1,0])
466
+ n0a2a1a0 = context.gmap.path(context.leftdart, [2,1,0])
467
+ a = Point3(context.gmap[context.leftdart].ebd123["pos"], context.gmap[n0a0].ebd123["pos"])
468
+ b = Point3(context.gmap[context.leftdart].ebd123["pos"], context.gmap[n0a1a0].ebd123["pos"])
469
+ c = Point3(context.gmap[context.leftdart].ebd123["pos"], context.gmap[n0a2a1a0].ebd123["pos"])
470
+ a = a.add(b)
471
+ a = a.add(c)
472
+ a = a.scale(1.0/3.0)
473
+ a = a.add(context.gmap[context.leftdart].ebd123["pos"])
474
+
475
+ return a
476
+
477
+ expr_n1_pos = Expr3DEbd123("pos",fun_n1_pos)
478
+ expr_n7_pos = Expr3DEbd123("pos",fun_n7_pos)
479
+ expr_n19_pos = Expr3DEbd123("pos",fun_n19_pos)
480
+ expr_nX_color = Expr3DEbd01("color",fun_nX_color)
481
+
482
+ rule = Rule3D("Menger3D","subdivision")
483
+ # motif gauche
484
+ ln0 = rule.make_leftnode("n0", [0,1,2,3], True)
485
+ # motif droit
486
+ rn0 = rule.make_rightnode("n0", [-1,1,2,3])
487
+ rn1 = rule.make_rightnode("n1", [-1,-1,2,3],[expr_n1_pos,expr_nX_color])
488
+ rn2 = rule.make_rightnode("n2", [0,-1,2,3],[expr_n1_pos,expr_nX_color])
489
+ rn3 = rule.make_rightnode("n3", [-1,-1,-1,3],[expr_n1_pos,expr_nX_color])
490
+ rn4 = rule.make_rightnode("n4", [-1,-1,1,-1],[expr_n1_pos,expr_nX_color])
491
+ rn5 = rule.make_rightnode("n5", [-1,-1,1,-1],[expr_n1_pos,expr_nX_color])
492
+ rn6 = rule.make_rightnode("n6", [-1,-1,-1,3],[expr_n1_pos,expr_nX_color])
493
+ rn7 = rule.make_rightnode("n7", [-1,1,-1,3],[expr_n7_pos,expr_nX_color])
494
+ rn8 = rule.make_rightnode("n8", [-1,-1,-1,-1],[expr_n7_pos,expr_nX_color])
495
+ rn9 = rule.make_rightnode("n9", [-1,-1,-1,-1],[expr_n7_pos,expr_nX_color])
496
+ rn10 = rule.make_rightnode("n10", [-1,-1,-1,3],[expr_n7_pos,expr_nX_color])
497
+ rn11 = rule.make_rightnode("n11", [0,-1,-1,3],[expr_n7_pos,expr_nX_color])
498
+ rn12 = rule.make_rightnode("n12", [0,-1,-1,-1],[expr_n7_pos,expr_nX_color])
499
+ rn13 = rule.make_rightnode("n13", [-1,2,-1,-1],[expr_n7_pos,expr_nX_color])
500
+ rn14 = rule.make_rightnode("n14", [-1,-1,-1,-1],[expr_n7_pos,expr_nX_color])
501
+ rn15 = rule.make_rightnode("n15", [-1,-1,-1,-1],[expr_n7_pos,expr_nX_color])
502
+ rn16 = rule.make_rightnode("n16", [-1,2,1,-1],[expr_n19_pos,expr_nX_color])
503
+ rn17 = rule.make_rightnode("n17", [-1,-1,1,-1],[expr_n19_pos,expr_nX_color])
504
+ rn18 = rule.make_rightnode("n18", [-1,-1,-1,-1],[expr_n19_pos,expr_nX_color])
505
+ rn19 = rule.make_rightnode("n19", [0,-1,2,-1],[expr_n19_pos,expr_nX_color])
506
+ rule.linkRightNodes(0,rn0,rn1)
507
+ rule.linkRightNodes(1,rn1,rn3)
508
+ rule.linkRightNodes(0,rn3,rn7)
509
+ rule.linkRightNodes(2,rn3,rn4)
510
+ rule.linkRightNodes(2,rn7,rn8)
511
+ rule.linkRightNodes(0,rn4,rn8)
512
+ rule.linkRightNodes(0,rn5,rn9)
513
+ rule.linkRightNodes(0,rn6,rn10)
514
+ rule.linkRightNodes(1,rn8,rn13)
515
+ rule.linkRightNodes(1,rn9,rn14)
516
+ rule.linkRightNodes(1,rn2,rn6)
517
+ rule.linkRightNodes(2,rn6,rn5)
518
+ rule.linkRightNodes(1,rn10,rn11)
519
+ rule.linkRightNodes(2,rn11,rn12)
520
+ rule.linkRightNodes(0,rn15,rn18)
521
+ rule.linkRightNodes(0,rn14,rn17)
522
+ rule.linkRightNodes(0,rn13,rn16)
523
+ rule.linkRightNodes(1,rn15,rn12)
524
+ rule.linkRightNodes(2,rn14,rn15)
525
+ rule.linkRightNodes(2,rn17,rn18)
526
+ rule.linkRightNodes(3,rn14,rn13)
527
+ rule.linkRightNodes(3,rn17,rn16)
528
+ rule.linkRightNodes(3,rn8,rn9)
529
+ rule.linkRightNodes(3,rn5,rn4)
530
+ rule.linkRightNodes(2,rn9,rn10)
531
+ rule.linkRightNodes(1,rn18,rn19)
532
+ rule.linkRightNodes(3,rn19,rn19)
533
+ rule.linkRightNodes(3,rn18,rn18)
534
+ rule.linkRightNodes(3,rn15,rn15)
535
+ rule.linkRightNodes(3,rn12,rn12)
536
+ rule.compile()
537
+ return rule
538
+
539
+
540
+ def rule_extrude_ExtrudeFace():
541
+ def fun_n0_normal(context):
542
+ n = context.leftdart.ebd01["normal"].copy()
543
+ n.scale(-1)
544
+ return n
545
+ def fun_n1_orient(context):
546
+ return not context.leftdart.ebd["orient"]
547
+ def fun_n1_normal(context):
548
+ d = context.leftdart
549
+ if(not d.ebd['orient']):
550
+ d = d.alpha(0)
551
+ e = d.a(0).ebd123["pos"] - d.ebd123["pos"]
552
+ e.normalize()
553
+ return context.leftdart.ebd01["normal"].cross(e)
554
+ def fun_n2_orient(context):
555
+ return context.leftdart.ebd["orient"]
556
+ def fun_n3_orient(context):
557
+ return not context.leftdart.ebd["orient"]
558
+ def fun_n4_orient(context):
559
+ return context.leftdart.ebd["orient"]
560
+ def fun_n5_orient(context):
561
+ return not context.leftdart.ebd["orient"]
562
+ def fun_n5_normal(context):
563
+ return context.leftdart.ebd01["normal"]
564
+ def fun_n5_pos(context):
565
+ # print(f">>> fun_n5_pos leftdart={context.leftdart} rightdart={context.rightdart} pos={context.leftdart.ebd123['pos']} normal={context.leftdart.ebd01['normal']}")
566
+ pos = context.leftdart.ebd123["pos"]
567
+ normal = context.leftdart.ebd01["normal"]
568
+ return pos + normal
569
+ def fun_n0_pos(context):
570
+ return context.leftdart.ebd123["pos"]
571
+ expr_n0_normal = Expr3DEbd01("normal",fun_n0_normal)
572
+ expr_n1_orient = Expr3DEbdDart("orient",fun_n1_orient)
573
+ expr_n1_normal = Expr3DEbd01("normal",fun_n1_normal)
574
+ expr_n2_orient = Expr3DEbdDart("orient",fun_n2_orient)
575
+ expr_n3_orient = Expr3DEbdDart("orient",fun_n3_orient)
576
+ expr_n4_orient = Expr3DEbdDart("orient",fun_n4_orient)
577
+ expr_n5_orient = Expr3DEbdDart("orient",fun_n5_orient)
578
+ expr_n5_normal = Expr3DEbd01("normal",fun_n5_normal)
579
+ expr_n5_pos = Expr3DEbd123("pos",fun_n5_pos)
580
+ expr_n0_pos = Expr3DEbd123("pos",fun_n0_pos)
581
+ rule = Rule3D("SolExtrudeFace","solution")
582
+ # motif gauche
583
+ ln0 = rule.make_leftnode("n0", [0,1], True)
584
+ rule.linkLeftNodes(2,ln0,ln0)
585
+ # motif droit
586
+ rn0 = rule.make_rightnode("n0", [0,1],[expr_n0_normal])
587
+ rn1 = rule.make_rightnode("n1", [0,-1],[expr_n1_orient,expr_n1_normal, expr_n0_pos])
588
+ rn2 = rule.make_rightnode("n2", [-1,2],[expr_n2_orient,expr_n1_normal, expr_n0_pos])
589
+ rn3 = rule.make_rightnode("n3", [-1,2],[expr_n3_orient,expr_n5_pos,expr_n1_normal])
590
+ rn4 = rule.make_rightnode("n4", [0,-1],[expr_n4_orient,expr_n5_pos,expr_n1_normal])
591
+ rn5 = rule.make_rightnode("n5", [0,1],[expr_n5_orient,expr_n5_normal,expr_n5_pos])
592
+ rule.linkRightNodes(2,rn0,rn1)
593
+ rule.linkRightNodes(1,rn1,rn2)
594
+ rule.linkRightNodes(0,rn2,rn3)
595
+ rule.linkRightNodes(1,rn3,rn4)
596
+ rule.linkRightNodes(3,rn4,rn4)
597
+ rule.linkRightNodes(3,rn3,rn3)
598
+ rule.linkRightNodes(3,rn2,rn2)
599
+ rule.linkRightNodes(3,rn1,rn1)
600
+ rule.linkRightNodes(2,rn4,rn5)
601
+ rule.linkRightNodes(3,rn5,rn5)
602
+ rule.compile()
603
+ return rule