1# ##### BEGIN GPL LICENSE BLOCK #####
2#
3#  This program is free software; you can redistribute it and/or
4#  modify it under the terms of the GNU General Public License
5#  as published by the Free Software Foundation; either version 2
6#  of the License, or (at your option) any later version.
7#
8#  This program is distributed in the hope that it will be useful,
9#  but WITHOUT ANY WARRANTY; without even the implied warranty of
10#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11#  GNU General Public License for more details.
12#
13#  You should have received a copy of the GNU General Public License
14#  along with this program; if not, write to the Free Software Foundation,
15#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16#
17# ##### END GPL LICENSE BLOCK #####
18
19# <pep8 compliant>
20
21# ----------------------------------------------------------
22# Main panel for windows
23# Author: Antonio Vazquez (antonioya)
24#
25# This code is base on the windows generator add-on created by SayProduction
26# and has been adapted to continuous editing and cycles materials
27#
28# ----------------------------------------------------------
29# noinspection PyUnresolvedReferences
30import bpy
31from math import cos, sin, radians, sqrt, pi
32from mathutils import Vector
33from bpy.types import Operator, PropertyGroup, Object, Panel
34from bpy.props import StringProperty, FloatProperty, BoolProperty, IntProperty, FloatVectorProperty, \
35    CollectionProperty, EnumProperty
36from .achm_tools import *
37
38
39def fitil(vr, fc, px, pz, x, y, z, zz, xx):
40    k3 = z * 2
41    vr.extend([[px[x] + xx, -z + zz, pz[y] + xx], [px[x] + xx + k3, -z + zz, pz[y] + xx + k3],
42               [px[x] + xx + k3, z + zz, pz[y] + xx + k3], [px[x] + xx, z + zz, pz[y] + xx]])
43    vr.extend([[px[x] + xx, -z + zz, pz[y + 1] - xx], [px[x] + xx + k3, -z + zz, pz[y + 1] - xx - k3],
44               [px[x] + xx + k3, z + zz, pz[y + 1] - xx - k3], [px[x] + xx, z + zz, pz[y + 1] - xx]])
45    vr.extend([[px[x + 1] - xx, -z + zz, pz[y + 1] - xx], [px[x + 1] - xx - k3, -z + zz, pz[y + 1] - xx - k3],
46               [px[x + 1] - xx - k3, z + zz, pz[y + 1] - xx - k3], [px[x + 1] - xx, z + zz, pz[y + 1] - xx]])
47    vr.extend([[px[x + 1] - xx, -z + zz, pz[y] + xx], [px[x + 1] - xx - k3, -z + zz, pz[y] + xx + k3],
48               [px[x + 1] - xx - k3, z + zz, pz[y] + xx + k3], [px[x + 1] - xx, z + zz, pz[y] + xx]])
49    n = len(vr)
50    fc.extend([[n - 16, n - 15, n - 11, n - 12], [n - 15, n - 14, n - 10, n - 11], [n - 14, n - 13, n - 9, n - 10]])
51    fc.extend([[n - 12, n - 11, n - 7, n - 8], [n - 11, n - 10, n - 6, n - 7], [n - 10, n - 9, n - 5, n - 6]])
52    fc.extend([[n - 8, n - 7, n - 3, n - 4], [n - 7, n - 6, n - 2, n - 3], [n - 6, n - 5, n - 1, n - 2]])
53    fc.extend([[n - 4, n - 3, n - 15, n - 16], [n - 3, n - 2, n - 14, n - 15], [n - 2, n - 1, n - 13, n - 14]])
54    z = 0.005
55    vr.extend([[px[x] + xx + k3, -z + zz, pz[y] + xx + k3], [px[x] + xx + k3, -z + zz, pz[y + 1] - xx - k3],
56               [px[x + 1] - xx - k3, -z + zz, pz[y + 1] - xx - k3], [px[x + 1] - xx - k3, -z + zz, pz[y] + xx + k3]])
57    vr.extend([[px[x] + xx + k3, z + zz, pz[y] + xx + k3], [px[x] + xx + k3, z + zz, pz[y + 1] - xx - k3],
58               [px[x + 1] - xx - k3, z + zz, pz[y + 1] - xx - k3], [px[x + 1] - xx - k3, z + zz, pz[y] + xx + k3]])
59    fc.extend([[n + 1, n + 0, n + 3, n + 2], [n + 4, n + 5, n + 6, n + 7]])
60
61
62def kapak(vr, fc, px, pz, x, y, z, zz):
63    k2 = z * 2
64    vr.extend(
65        [[px[x], -z + zz, pz[y]], [px[x] + k2, -z + zz, pz[y] + k2], [px[x] + k2, z + zz, pz[y] + k2],
66         [px[x], z + zz, pz[y]]])
67    vr.extend([[px[x], -z + zz, pz[y + 1]], [px[x] + k2, -z + zz, pz[y + 1] - k2], [px[x] + k2, z + zz, pz[y + 1] - k2],
68               [px[x], z + zz, pz[y + 1]]])
69    vr.extend(
70        [[px[x + 1], -z + zz, pz[y + 1]], [px[x + 1] - k2, -z + zz, pz[y + 1] - k2],
71         [px[x + 1] - k2, z + zz, pz[y + 1] - k2],
72         [px[x + 1], z + zz, pz[y + 1]]])
73    vr.extend([[px[x + 1], -z + zz, pz[y]], [px[x + 1] - k2, -z + zz, pz[y] + k2], [px[x + 1] - k2, z + zz, pz[y] + k2],
74               [px[x + 1], z + zz, pz[y]]])
75    n = len(vr)
76    fc.extend([[n - 16, n - 15, n - 11, n - 12], [n - 15, n - 14, n - 10, n - 11], [n - 14, n - 13, n - 9, n - 10],
77               [n - 13, n - 16, n - 12, n - 9]])
78    fc.extend([[n - 12, n - 11, n - 7, n - 8], [n - 11, n - 10, n - 6, n - 7], [n - 10, n - 9, n - 5, n - 6],
79               [n - 9, n - 12, n - 8, n - 5]])
80    fc.extend([[n - 8, n - 7, n - 3, n - 4], [n - 7, n - 6, n - 2, n - 3], [n - 6, n - 5, n - 1, n - 2],
81               [n - 5, n - 8, n - 4, n - 1]])
82    fc.extend([[n - 4, n - 3, n - 15, n - 16], [n - 3, n - 2, n - 14, n - 15], [n - 2, n - 1, n - 13, n - 14],
83               [n - 1, n - 4, n - 16, n - 13]])
84
85
86# -----------------------------------------
87# Set default values for each window type
88# -----------------------------------------
89def set_defaults(s):
90    if s.prs == '1':
91        s.gen = 3
92        s.yuk = 1
93        s.kl1 = 5
94        s.kl2 = 5
95        s.fk = 2
96        s.gny0 = 190
97        s.mr = True
98        s.gnx0 = 60
99        s.gnx1 = 110
100        s.gnx2 = 60
101        s.k00 = True
102        s.k01 = False
103        s.k02 = True
104    if s.prs == '2':
105        s.gen = 3
106        s.yuk = 1
107        s.kl1 = 5
108        s.kl2 = 5
109        s.fk = 2
110        s.gny0 = 190
111        s.mr = True
112        s.gnx0 = 60
113        s.gnx1 = 60
114        s.gnx2 = 60
115        s.k00 = True
116        s.k01 = False
117        s.k02 = True
118    if s.prs == '3':
119        s.gen = 3
120        s.yuk = 1
121        s.kl1 = 5
122        s.kl2 = 5
123        s.fk = 2
124        s.gny0 = 190
125        s.mr = True
126        s.gnx0 = 55
127        s.gnx1 = 50
128        s.gnx2 = 55
129        s.k00 = True
130        s.k01 = False
131        s.k02 = True
132    if s.prs == '4':
133        s.gen = 3
134        s.yuk = 1
135        s.kl1 = 5
136        s.kl2 = 5
137        s.fk = 2
138        s.gny0 = 150
139        s.mr = True
140        s.gnx0 = 55
141        s.gnx1 = 50
142        s.gnx2 = 55
143        s.k00 = True
144        s.k01 = False
145        s.k02 = True
146    if s.prs == '5':
147        s.gen = 3
148        s.yuk = 1
149        s.kl1 = 5
150        s.kl2 = 5
151        s.fk = 2
152        s.gny0 = 150
153        s.mr = True
154        s.gnx0 = 50
155        s.gnx1 = 40
156        s.gnx2 = 50
157        s.k00 = True
158        s.k01 = False
159        s.k02 = True
160    if s.prs == '6':
161        s.gen = 1
162        s.yuk = 1
163        s.kl1 = 5
164        s.kl2 = 5
165        s.fk = 2
166        s.gny0 = 40
167        s.mr = True
168        s.gnx0 = 40
169        s.k00 = False
170    if s.prs == '7':
171        s.gen = 1
172        s.yuk = 2
173        s.kl1 = 5
174        s.kl2 = 5
175        s.fk = 2
176        s.gny0 = 195
177        s.gny1 = 40
178        s.gnx0 = 70
179        s.k00 = True
180        s.k10 = False
181        s.mr = False
182    if s.prs == '8':
183        s.gen = 1
184        s.yuk = 2
185        s.kl1 = 5
186        s.kl2 = 5
187        s.fk = 2
188        s.gny0 = 180
189        s.gny1 = 35
190        s.gnx0 = 70
191        s.k00 = True
192        s.k10 = False
193        s.mr = False
194
195
196# ------------------------------------------------------------------
197# Define operator class to create window panels
198# ------------------------------------------------------------------
199class ARCHIMESH_PT_Win(Operator):
200    bl_idname = "mesh.archimesh_winpanel"
201    bl_label = "Panel Window"
202    bl_description = "Generate editable flat windows"
203    bl_category = 'View'
204    bl_options = {'REGISTER', 'UNDO'}
205
206    # -----------------------------------------------------
207    # Draw (create UI interface)
208    # -----------------------------------------------------
209    # noinspection PyUnusedLocal
210    def draw(self, context):
211        layout = self.layout
212        row = layout.row()
213        row.label(text="Use Properties panel (N) to define parms", icon='INFO')
214
215    # -----------------------------------------------------
216    # Execute
217    # -----------------------------------------------------
218    # noinspection PyUnusedLocal
219    def execute(self, context):
220        if bpy.context.mode == "OBJECT":
221            create_window()
222            return {'FINISHED'}
223        else:
224            self.report({'WARNING'}, "Archimesh: Option only valid in Object mode")
225            return {'CANCELLED'}
226
227
228# ------------------------------------------------------------------------------
229# Create the window
230# ------------------------------------------------------------------------------
231def create_window():
232    # deselect all objects
233    for o in bpy.data.objects:
234        o.select_set(False)
235    # Create main object
236    window_mesh = bpy.data.meshes.new("Window")
237    window_object = bpy.data.objects.new("Window", window_mesh)
238
239    # Link object to scene
240    bpy.context.collection.objects.link(window_object)
241    window_object.WindowPanelGenerator.add()
242    window_object.location = bpy.context.scene.cursor.location
243
244    # Shape the mesh.
245    do_mesh(window_object, window_mesh)
246
247    # deactivate others
248    for o in bpy.data.objects:
249        if o.select_get() is True and o.name != window_object.name:
250            o.select_set(False)
251
252    # Select, and activate object
253    window_object.select_set(True)
254    bpy.context.view_layer.objects.active = window_object
255
256    do_ctrl_box(window_object)
257    # Reselect
258    window_object.select_set(True)
259    bpy.context.view_layer.objects.active = window_object
260
261
262# ------------------------------------------------------------------------------
263# Update mesh of the window
264# ------------------------------------------------------------------------------
265# noinspection PyUnusedLocal
266def update_window(self, context):
267    # When update, the active object is the main object.
268    o = bpy.context.active_object
269    oldmesh = o.data
270    oldname = o.data.name
271    # Now deselect that object to not delete it.
272    o.select_set(False)
273    # # and create a new mesh for the object:
274    # tmp_mesh = bpy.data.meshes.new("temp")
275    # deselect all objects
276    for obj in bpy.data.objects:
277        obj.select_set(False)
278    # ---------------------------------
279    #  Clear Parent objects (autohole)
280    # ---------------------------------
281    myparent = o.parent
282    if myparent is not None:
283        ploc = myparent.location
284    else:
285        ploc = o.location
286    if myparent is not None:
287        o.parent = None
288        o.location = ploc
289        # remove_children(parent)
290        for child in myparent.children:
291            # noinspection PyBroadException
292            try:
293                # clear child data
294                child.hide_viewport = False  # must be visible to avoid bug
295                child.hide_render = False  # must be visible to avoid bug
296                old = child.data
297                child.select_set(True)
298                bpy.ops.object.delete()
299                bpy.data.meshes.remove(old)
300            except:
301                pass
302
303        myparent.select_set(True)
304        bpy.ops.object.delete()
305
306    # Finally create all that again
307    tmp_mesh = bpy.data.meshes.new("temp")
308    do_mesh(o, tmp_mesh, True)
309    o.data = tmp_mesh
310    # Remove data (mesh of active object),
311    if oldmesh.users == 0:
312        bpy.data.meshes.remove(oldmesh)
313    else:
314        oldmesh.name = "invalid"
315
316    tmp_mesh.name = oldname
317    # deactivate others
318    for ob in bpy.data.objects:
319        if ob.select_get() is True and ob.name != o.name:
320            ob.select_set(False)
321    # and select, and activate, the object.
322    o.select_set(True)
323    bpy.context.view_layer.objects.active = o
324
325    do_ctrl_box(o)
326
327    # Reselect
328    o.select_set(True)
329    bpy.context.view_layer.objects.active = o
330
331
332# ------------------------------------------------------------------------------
333# Generate object
334# For object, it only shapes mesh
335# ------------------------------------------------------------------------------
336# noinspection PyUnusedLocal
337def do_mesh(myobject, tmp_mesh, update=False):
338    # noinspection PyBroadException
339    try:
340        op = myobject.WindowPanelGenerator[0]
341        # Create only mesh, because the object was created before.
342        r = generate_window_object(op, tmp_mesh)
343        if r is False:
344            return False
345
346        # refine unit
347        remove_doubles(myobject)
348        set_normals(myobject)
349
350        # saves OpenGL data
351        # sum width
352        totx = myobject.dimensions.x
353        op.glpoint_a = (-totx / 2, 0, 0)
354        top_a, top_b, top_c = get_high_points(myobject, totx, op.UST)
355        op.glpoint_b = (-totx / 2, 0, top_a)
356        op.glpoint_c = (totx / 2, 0, top_b)
357        op.glpoint_d = (0, 0, top_c)
358
359        # Lock
360        myobject.lock_location = (True, True, True)
361        myobject.lock_rotation = (True, True, True)
362        return True
363    except:
364        return False
365
366
367# ------------------------------------------------------------------------------
368# Generate ctrl box
369#
370# ------------------------------------------------------------------------------
371# noinspection PyUnusedLocal
372def do_ctrl_box(myobject):
373    op = myobject.WindowPanelGenerator[0]
374    # -------------------------
375    # Create empty and parent
376    # -------------------------
377    bpy.ops.object.empty_add(type='PLAIN_AXES')
378    myempty = bpy.data.objects[bpy.context.active_object.name]
379    myempty.location = myobject.location
380
381    myempty.name = "Window_Group"
382    parentobject(myempty, myobject)
383    myobject["archimesh.hole_enable"] = True
384    # Rotate Empty
385    myempty.rotation_euler.z = radians(op.r)
386    # Create control box to open wall holes
387    myctrl = create_ctrl_box(myobject, "CTRL_Hole")
388
389    # Add custom property to detect Controller
390    myctrl["archimesh.ctrl_hole"] = True
391
392    set_normals(myctrl)
393    myctrl.parent = myempty
394    myctrl.location.x = 0
395    myctrl.location.y = 0
396    myctrl.location.z = 0
397    myctrl.display_type = 'WIRE'
398    myctrl.hide_viewport = False
399    myctrl.hide_render = True
400    if bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
401        myctrl.cycles_visibility.camera = False
402        myctrl.cycles_visibility.diffuse = False
403        myctrl.cycles_visibility.glossy = False
404        myctrl.cycles_visibility.transmission = False
405        myctrl.cycles_visibility.scatter = False
406        myctrl.cycles_visibility.shadow = False
407
408        mat = create_transparent_material("hidden_material", False)
409        set_material(myctrl, mat)
410
411
412# ------------------------------------------------------------------------------
413# Update the parameters using a default value
414# ------------------------------------------------------------------------------
415# noinspection PyUnusedLocal
416def update_using_default(self, context):
417    o = context.object
418    myobject = o.WindowPanelGenerator[0]
419    if myobject.son != myobject.prs:
420        set_defaults(myobject)
421        myobject.son = myobject.prs
422
423
424# ------------------------------------------------------------------------------
425# Generate window object
426# ------------------------------------------------------------------------------
427def generate_window_object(op, mymesh):
428    myvertex = []
429    mfaces = []
430    # noinspection PyBroadException
431    try:
432        rst, ft1, cam, mer, sm = generate_vertex_data(op, myvertex, mfaces)
433        if rst is not True:
434            return False
435
436        mymesh.from_pydata(myvertex, [], mfaces)
437        # Uncomment for debug
438        # mymesh.validate(verbose=True)
439        # Assign materials
440        if op.mt1 == '1':
441            mymesh.materials.append(create_diffuse_material("PVC", False, 1, 1, 1, 1, 1, 1))
442        elif op.mt1 == '2':
443            mymesh.materials.append(create_diffuse_material("Wood", False, 0.3, 0.2, 0.1, 0.3, 0.2, 0.1))
444        elif op.mt1 == '3':
445            mymesh.materials.append(create_diffuse_material("Plastic", False, 0, 0, 0, 0, 0, 0))
446        if op.mt2 == '1':
447            mymesh.materials.append(create_diffuse_material("PVC", False, 1, 1, 1, 1, 1, 1))
448        elif op.mt2 == '2':
449            mymesh.materials.append(create_diffuse_material("Wood", False, 0.3, 0.2, 0.1, 0.3, 0.2, 0.1))
450        elif op.mt2 == '3':
451            mymesh.materials.append(create_diffuse_material("Plastic", False, 0, 0, 0, 0, 0, 0))
452
453        mymesh.materials.append(create_glass_material("Glass", False))
454        if op.mr is True:
455            mymesh.materials.append(create_diffuse_material("Marble", False, 0.9, 0.8, 0.7, 0.9, 0.8, 0.7))
456
457        p = len(mymesh.polygons)
458        for i in ft1:
459            if -1 < i < p:
460                mymesh.polygons[i].material_index = 1
461        for i in cam:
462            if -1 < i < p:
463                mymesh.polygons[i].material_index = 2
464        for i in mer:
465            if -1 < i < p:
466                mymesh.polygons[i].material_index = 3
467        for i in sm:
468            if -1 < i < p:
469                mymesh.polygons[i].use_smooth = 1
470
471        mymesh.update(calc_edges=True)
472
473        return True
474    except:
475        return False
476
477
478# -----------------------------------------
479# Generate vertex and faces data
480# -----------------------------------------
481def generate_vertex_data(op, myvertex, myfaces):
482    # noinspection PyBroadException
483    try:
484        h1 = 0
485        c = 0
486        t1 = 0
487
488        mx = op.gen
489        my = op.yuk
490        k1 = op.kl1 / 100
491        k2 = op.kl2 / 100
492        k3 = op.fk / 200
493        res = op.res
494
495        u = op.kl1 / 100
496        xlist = [0, round(u, 2)]
497        if mx > 0:
498            u += op.gnx0 / 100
499            xlist.append(round(u, 2))
500            u += k2
501            xlist.append(round(u, 2))
502        if mx > 1:
503            u += op.gnx1 / 100
504            xlist.append(round(u, 2))
505            u += k2
506            xlist.append(round(u, 2))
507        if mx > 2:
508            u += op.gnx2 / 100
509            xlist.append(round(u, 2))
510            u += k2
511            xlist.append(round(u, 2))
512        if mx > 3:
513            u += op.gnx3 / 100
514            xlist.append(round(u, 2))
515            u += k2
516            xlist.append(round(u, 2))
517        if mx > 4:
518            u += op.gnx4 / 100
519            xlist.append(round(u, 2))
520            u += k2
521            xlist.append(round(u, 2))
522        if mx > 5:
523            u += op.gnx5 / 100
524            xlist.append(round(u, 2))
525            u += k2
526            xlist.append(round(u, 2))
527        if mx > 6:
528            u += op.gnx6 / 100
529            xlist.append(round(u, 2))
530            u += k2
531            xlist.append(round(u, 2))
532        if mx > 7:
533            u += op.gnx7 / 100
534            xlist.append(round(u, 2))
535            u += k2
536            xlist.append(round(u, 2))
537
538        xlist[-1] = xlist[-2] + k1
539
540        u = op.kl1 / 100
541        zlist = [0, round(u, 2)]
542        if my > 0:
543            u += op.gny0 / 100
544            zlist.append(round(u, 2))
545            u += k2
546            zlist.append(round(u, 2))
547        if my > 1:
548            u += op.gny1 / 100
549            zlist.append(round(u, 2))
550            u += k2
551            zlist.append(round(u, 2))
552        if my > 2:
553            u += op.gny2 / 100
554            zlist.append(round(u, 2))
555            u += k2
556            zlist.append(round(u, 2))
557        if my > 3:
558            u += op.gny3 / 100
559            zlist.append(round(u, 2))
560            u += k2
561            zlist.append(round(u, 2))
562        if my > 4:
563            u += op.gny4 / 100
564            zlist.append(round(u, 2))
565            u += k2
566            zlist.append(round(u, 2))
567        zlist[-1] = zlist[-2] + k1
568
569        u = xlist[-1] / 2
570        for i in range(0, len(xlist)):
571            xlist[i] -= u
572        kx = [[op.k00, op.k10, op.k20, op.k30, op.k40],
573              [op.k01, op.k11, op.k21, op.k31, op.k41],
574              [op.k02, op.k12, op.k22, op.k32, op.k42],
575              [op.k03, op.k13, op.k23, op.k33, op.k43],
576              [op.k04, op.k14, op.k24, op.k34, op.k44],
577              [op.k05, op.k15, op.k25, op.k35, op.k45],
578              [op.k06, op.k16, op.k26, op.k36, op.k46],
579              [op.k07, op.k17, op.k27, op.k37, op.k47]]
580        cam = []
581        mer = []
582        ftl = []
583        sm = []
584        # -------------------------
585        # VERTICES
586        # -------------------------
587        myvertex.extend([[xlist[0], -k1 / 2, zlist[0]], [xlist[0], k1 / 2, zlist[0]]])
588        for x in range(1, len(xlist) - 1):
589            myvertex.extend([[xlist[x], -k1 / 2, zlist[1]], [xlist[x], k1 / 2, zlist[1]]])
590        myvertex.extend([[xlist[-1], -k1 / 2, zlist[0]], [xlist[-1], k1 / 2, zlist[0]]])
591        for z in range(2, len(zlist) - 2, 2):
592            for x in range(0, len(xlist)):
593                myvertex.extend([[xlist[x], -k1 / 2, zlist[z]], [xlist[x], k1 / 2, zlist[z]]])
594            for x in range(0, len(xlist)):
595                myvertex.extend([[xlist[x], -k1 / 2, zlist[z + 1]], [xlist[x], k1 / 2, zlist[z + 1]]])
596        z = len(zlist) - 2
597        myvertex.extend([[xlist[0], -k1 / 2, zlist[z + 1]], [xlist[0], k1 / 2, zlist[z + 1]]])
598        alt = []
599        ust = [len(myvertex) - 2, len(myvertex) - 1]
600        for x in range(1, len(xlist) - 1):
601            myvertex.extend([[xlist[x], -k1 / 2, zlist[z]], [xlist[x], k1 / 2, zlist[z]]])
602            alt.extend([len(myvertex) - 2, len(myvertex) - 1])
603        myvertex.extend([[xlist[-1], -k1 / 2, zlist[z + 1]], [xlist[-1], k1 / 2, zlist[z + 1]]])
604        son = [len(myvertex) - 2, len(myvertex) - 1]
605        # -------------------------
606        # FACES
607        # -------------------------
608        myfaces.append([0, 1, 3 + mx * 4, 2 + mx * 4])
609        fb = [0]
610        fr = [1]
611        for i in range(0, mx * 4, 4):
612            myfaces.append([i + 3, i + 2, i + 4, i + 5])
613            fb.extend([i + 2, i + 4])
614            fr.extend([i + 3, i + 5])
615        fr.append(3 + mx * 4)
616        fb.append(2 + mx * 4)
617        fb.reverse()
618        myfaces.extend([fb, fr])
619        # Yatay
620        y = (mx * 4 + 4)
621        v = mx * 4 + 2
622        for z in range(0, (my - 1) * y * 2, y * 2):
623            myfaces.extend([[z + y + 1, z + y, z + y + 4 + mx * 4, z + y + 5 + mx * 4],
624                            [z + y + v, z + y + v + 1, z + y + v + 5 + mx * 4, z + y + v + 4 + mx * 4]])
625            for i in range(0, mx * 4 + 2, 2):
626                myfaces.extend([[z + i + y + 0, z + i + y + 2, z + i + y + v + 4, z + i + y + v + 2],
627                                [z + i + y + 3, z + i + y + 1, z + i + y + v + 3, z + i + y + v + 5]])
628            for i in range(0, mx * 4 - 3, 4):
629                myfaces.extend([[z + i + y + 2, z + i + y + 3, z + i + y + 5, z + i + y + 4],
630                                [z + i + y + v + 5, z + i + y + v + 4, z + i + y + v + 6,
631                                 z + i + y + v + 7]])
632        # Dikey
633        for y in range(0, my):
634            z = y * (mx * 4 + 4) * 2
635            for i in range(0, mx * 4 + 2, 4):
636                myfaces.extend([[z + i + 1, z + i + 0, z + i + v + 2, z + i + v + 3],
637                                [z + i + 3, z + i + 1, z + i + v + 3, z + i + v + 5],
638                                [z + i + 2, z + i + 3, z + i + v + 5, z + i + v + 4],
639                                [z + i + 0, z + i + 2, z + i + v + 4, z + i + v + 2]])
640        # Fitil
641        if op.UST == '1':
642            y1 = my
643        else:
644            y1 = my - 1
645        for y in range(0, y1):
646            for x in range(0, mx):
647                if kx[x][y] is True:
648                    kapak(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k2 / 2, (k1 + k2) * 0.5 - 0.01)
649                    fitil(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k3, (k1 + k2) * 0.5 - 0.01, k2)
650                else:
651                    fitil(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k3, 0, 0)
652                m = len(myfaces)
653                cam.extend([m - 1, m - 2])
654                ftl.extend([m - 3, m - 4, m - 5, m - 6, m - 7, m - 8, m - 9, m - 10, m - 11, m - 12, m - 13, m - 14])
655        # -----------------------------------------------------
656        if op.UST == '1':  # Duz
657            myfaces.append([ust[1], ust[0], son[0], son[1]])
658            for i in range(0, mx * 4, 4):
659                myfaces.append([alt[i], alt[i + 1], alt[i + 3], alt[i + 2]])
660            on = [ust[0]]
661            ar = [ust[1]]
662            for i in range(0, len(alt) - 1, 2):
663                on.append(alt[i])
664                ar.append(alt[i + 1])
665            on.append(son[0])
666            myfaces.append(on)
667            ar.append(son[1])
668            ar.reverse()
669            myfaces.append(ar)
670        elif op.UST == '2':  # Arch
671            if op.DT2 == '1':
672                h1 = op.VL1 / 100
673                if op.VL1 < 6:
674                    h1 = 6 / 100
675
676                if h1 < 0.01:
677                    h1 = 0.01
678                    # op.VL1 = 1
679                elif h1 >= u:
680                    h1 = u - 0.01
681                    # op.VL1 = h1 * 100
682                if h1 < 0.07:
683                    h1 = 0.07
684
685                h = sqrt(u ** 2 + h1 ** 2) / 2
686                e = h * (u / h1)
687                c = sqrt(h ** 2 + e ** 2)
688                t1 = zlist[-1] - h1
689            elif op.DT2 == '2':
690                c = op.VL2 / 100
691                if c < u + 0.01:
692                    c = u + 0.01
693                    # op.VL2 = c * 100
694                t1 = sqrt(c ** 2 - u ** 2) + zlist[-1] - c
695            r = c - k1
696            z = zlist[-1] - c
697
698            myvertex[ust[0]][2] = t1
699            myvertex[ust[1]][2] = t1
700            myvertex[son[0]][2] = t1
701            myvertex[son[1]][2] = t1
702            for i in alt:
703                myvertex[i][2] = sqrt(r ** 2 - myvertex[i][0] ** 2) + z
704
705            on = [son[0]]
706            u1 = []
707            for i in range(0, res):
708                a = i * pi / res
709                x = cos(a) * c
710                if -u < x < u:
711                    myvertex.append([x, -k1 / 2, sin(a) * c + z])
712                    on.append(len(myvertex) - 1)
713            u1.extend(on)
714            u1.append(ust[0])
715            on.extend([ust[0], alt[0]])
716            ar = []
717            d1 = []
718            d2 = []
719            for i in range(0, len(alt) - 2, 4):
720                x1 = myvertex[alt[i + 0]][0]
721                x2 = myvertex[alt[i + 2]][0]
722                on.append(alt[i + 0])
723                ar.append(alt[i + 1])
724                t1 = [alt[i + 0]]
725                t2 = [alt[i + 1]]
726                for j in range(0, res):
727                    a = j * pi / res
728                    x = -cos(a) * r
729                    if x1 < x < x2:
730                        myvertex.extend([[x, -k1 / 2, sin(a) * r + z], [x, k1 / 2, sin(a) * r + z]])
731                        on.append(len(myvertex) - 2)
732                        ar.append(len(myvertex) - 1)
733                        t1.append(len(myvertex) - 2)
734                        t2.append(len(myvertex) - 1)
735                on.append(alt[i + 2])
736                ar.append(alt[i + 3])
737                t1.append(alt[i + 2])
738                t2.append(alt[i + 3])
739                d1.append(t1)
740                d2.append(t2)
741            ar.append(son[1])
742            u2 = [son[1]]
743            for i in range(0, res):
744                a = i * pi / res
745                x = cos(a) * c
746                if -u < x < u:
747                    myvertex.append([x, k1 / 2, sin(a) * c + z])
748                    ar.append(len(myvertex) - 1)
749                    u2.append(len(myvertex) - 1)
750            ar.append(ust[1])
751            u2.append(ust[1])
752            ar.reverse()
753            myfaces.extend([on, ar])
754            for i in range(0, len(u1) - 1):
755                myfaces.append([u1[i + 1], u1[i], u2[i], u2[i + 1]])
756                sm.append(len(myfaces) - 1)
757            for a in range(0, mx):
758                for i in range(0, len(d1[a]) - 1):
759                    myfaces.append([d1[a][i + 1], d1[a][i], d2[a][i], d2[a][i + 1]])
760                    sm.append(len(myfaces) - 1)
761            y = my - 1
762            for x in range(0, mx):
763                if kx[x][y] is True:
764                    fr = (k1 + k2) * 0.5 - 0.01
765                    ek = k2
766                    r = c - k1
767                    k = r - k2
768
769                    x1 = xlist[x * 2 + 1]
770                    x2 = xlist[x * 2 + 2]
771                    myvertex.extend([[x2, fr - k2 / 2, z + 1], [x2 - k2, fr - k2 / 2, z + 1],
772                                     [x2 - k2, fr + k2 / 2, z + 1],
773                                     [x2, fr + k2 / 2, z + 1]])
774                    myvertex.extend([[x2, fr - k2 / 2, zlist[-3]], [x2 - k2, fr - k2 / 2, zlist[-3] + k2],
775                                     [x2 - k2, fr + k2 / 2,
776                                      zlist[-3] + k2],
777                                     [x2, fr + k2 / 2, zlist[-3]]])
778                    myvertex.extend([[x1, fr - k2 / 2, zlist[-3]], [x1 + k2, fr - k2 / 2, zlist[-3] + k2],
779                                     [x1 + k2, fr + k2 / 2,
780                                      zlist[-3] + k2],
781                                     [x1, fr + k2 / 2, zlist[-3]]])
782                    myvertex.extend([[x1, fr - k2 / 2, z + 1], [x1 + k2, fr - k2 / 2, z + 1],
783                                     [x1 + k2, fr + k2 / 2, z + 1],
784                                     [x1, fr + k2 / 2, z + 1]])
785
786                    n = len(myvertex)
787                    myfaces.extend([[n - 16, n - 15, n - 11, n - 12], [n - 15, n - 14, n - 10, n - 11],
788                                    [n - 14, n - 13, n - 9, n - 10], [n - 13, n - 16, n - 12, n - 9]])
789                    myfaces.extend(
790                        [[n - 12, n - 11, n - 7, n - 8], [n - 11, n - 10, n - 6, n - 7], [n - 10, n - 9, n - 5, n - 6],
791                         [n - 9, n - 12, n - 8, n - 5]])
792                    myfaces.extend(
793                        [[n - 8, n - 7, n - 3, n - 4], [n - 7, n - 6, n - 2, n - 3], [n - 6, n - 5, n - 1, n - 2],
794                         [n - 5, n - 8, n - 4, n - 1]])
795                    alt = [n - 16, n - 15, n - 14, n - 13, n - 4, n - 3, n - 2, n - 1]
796                    myvertex[alt[0]][2] = sqrt(r ** 2 - myvertex[alt[0]][0] ** 2) + z
797                    myvertex[alt[1]][2] = sqrt(k ** 2 - myvertex[alt[1]][0] ** 2) + z
798                    myvertex[alt[2]][2] = sqrt(k ** 2 - myvertex[alt[2]][0] ** 2) + z
799                    myvertex[alt[3]][2] = sqrt(r ** 2 - myvertex[alt[3]][0] ** 2) + z
800                    myvertex[alt[4]][2] = sqrt(r ** 2 - myvertex[alt[4]][0] ** 2) + z
801                    myvertex[alt[5]][2] = sqrt(k ** 2 - myvertex[alt[5]][0] ** 2) + z
802                    myvertex[alt[6]][2] = sqrt(k ** 2 - myvertex[alt[6]][0] ** 2) + z
803                    myvertex[alt[7]][2] = sqrt(r ** 2 - myvertex[alt[7]][0] ** 2) + z
804
805                    d1 = []
806                    d2 = []
807                    t1 = []
808                    t2 = []
809                    for i in range(0, res):
810                        a = i * pi / res
811                        y1 = cos(a) * r
812                        y2 = -cos(a) * k
813                        if x1 < y1 < x2:
814                            myvertex.extend([[y1, fr - k2 / 2, sin(a) * r + z], [y1, fr + k2 / 2,
815                                                                                      sin(a) * r + z]])
816                            t1.append(len(myvertex) - 2)
817                            t2.append(len(myvertex) - 1)
818                        if x1 + k2 < y2 < x2 - k2:
819                            myvertex.extend([[y2, fr - k2 / 2, sin(a) * k + z], [y2, fr + k2 / 2,
820                                                                                      sin(a) * k + z]])
821                            d1.append(len(myvertex) - 2)
822                            d2.append(len(myvertex) - 1)
823                    on = [alt[1], alt[0]]
824                    on.extend(t1)
825                    on.extend([alt[4], alt[5]])
826                    on.extend(d1)
827                    ar = [alt[2], alt[3]]
828                    ar.extend(t2)
829                    ar.extend([alt[7], alt[6]])
830                    ar.extend(d2)
831                    ar.reverse()
832
833                    if d1 == [] and t1 == []:
834                        myfaces.extend([on, ar, [alt[5], alt[6], alt[2], alt[1]], [alt[7], alt[4], alt[0], alt[
835                            3]]])
836                        m = len(myfaces)
837                        sm.extend(
838                            [m - 1, m - 2])
839                    elif d1 == [] and t1 != []:
840                        myfaces.extend([on, ar, [alt[5], alt[6], alt[2], alt[1]], [alt[7], alt[4], t1[-1], t2[-1]],
841                                        [alt[0], alt[3], t2[0], t1[0]]])
842                        m = len(myfaces)
843                        sm.extend(
844                            [m - 1, m - 2, m - 3])
845                    elif d1 != [] and t1 == []:
846                        myfaces.extend([on, ar, [alt[5], alt[6], d2[0], d1[0]], [alt[2], alt[1], d1[-1], d2[-1]],
847                                        [alt[7], alt[4], alt[0], alt[3]]])
848                        m = len(myfaces)
849                        sm.extend(
850                            [m - 1, m - 2, m - 3])
851                    else:
852                        myfaces.extend([on, ar, [alt[5], alt[6], d2[0], d1[0]], [alt[2], alt[1], d1[-1], d2[-1]],
853                                        [alt[7], alt[4], t1[-1], t2[-1]], [alt[0], alt[3], t2[0], t1[0]]])
854                        m = len(myfaces)
855                        sm.extend(
856                            [m - 1, m - 2, m - 3, m - 4])
857
858                    for i in range(0, len(d1) - 1):
859                        myfaces.append([d1[i + 1], d1[i], d2[i], d2[i + 1]])
860                        sm.append(len(myfaces) - 1)
861                    for i in range(0, len(t1) - 1):
862                        myfaces.append([t1[i + 1], t1[i], t2[i], t2[i + 1]])
863                        sm.append(len(myfaces) - 1)
864                    r = c - k1 - k2
865                    k = r - k3 * 2
866                else:
867                    fr = 0
868                    ek = 0
869                    r = c - k1
870                    k = r - k3 * 2
871                # Fitil
872                x1 = xlist[x * 2 + 1] + ek
873                x2 = xlist[x * 2 + 2] - ek
874                myvertex.extend([[x2, fr - k3, z + 1], [x2 - k3 * 2, fr - k3, z + 1], [x2 - k3 * 2, fr + k3, z + 1],
875                                 [x2, fr + k3, z + 1]])
876                myvertex.extend([[x2, fr - k3, zlist[-3] + ek], [x2 - k3 * 2, fr - k3, zlist[-3] + ek + k3 * 2],
877                                 [x2 - k3 * 2, fr + k3, zlist[-3] + ek + k3 * 2], [x2, fr + k3, zlist[-3] + ek]])
878                myvertex.extend([[x1, fr - k3, zlist[-3] + ek], [x1 + k3 * 2, fr - k3, zlist[-3] + ek + k3 * 2],
879                                 [x1 + k3 * 2, fr + k3, zlist[-3] + ek + k3 * 2], [x1, fr + k3, zlist[-3] + ek]])
880                myvertex.extend([[x1, fr - k3, z + 1], [x1 + k3 * 2, fr - k3, z + 1], [x1 + k3 * 2, fr + k3, z + 1],
881                                 [x1, fr + k3, z + 1]])
882                n = len(myvertex)
883                myfaces.extend(
884                    [[n - 16, n - 15, n - 11, n - 12], [n - 15, n - 14, n - 10, n - 11], [n - 14, n - 13, n - 9,
885                                                                                          n - 10]])
886                myfaces.extend(
887                    [[n - 12, n - 11, n - 7, n - 8], [n - 11, n - 10, n - 6, n - 7], [n - 10, n - 9, n - 5, n - 6]])
888                myfaces.extend([[n - 8, n - 7, n - 3, n - 4], [n - 7, n - 6, n - 2, n - 3], [n - 6, n - 5, n - 1,
889                                                                                             n - 2]])
890                m = len(myfaces)
891                ftl.extend([m - 1, m - 2, m - 3, m - 4, m - 5, m - 6, m - 7, m - 8, m - 9])
892                alt = [n - 16, n - 15, n - 14, n - 13, n - 4, n - 3, n - 2, n - 1]
893                myvertex[alt[0]][2] = sqrt(r ** 2 - myvertex[alt[0]][0] ** 2) + z
894                myvertex[alt[1]][2] = sqrt(k ** 2 - myvertex[alt[1]][0] ** 2) + z
895                myvertex[alt[2]][2] = sqrt(k ** 2 - myvertex[alt[2]][0] ** 2) + z
896                myvertex[alt[3]][2] = sqrt(r ** 2 - myvertex[alt[3]][0] ** 2) + z
897                myvertex[alt[4]][2] = sqrt(r ** 2 - myvertex[alt[4]][0] ** 2) + z
898                myvertex[alt[5]][2] = sqrt(k ** 2 - myvertex[alt[5]][0] ** 2) + z
899                myvertex[alt[6]][2] = sqrt(k ** 2 - myvertex[alt[6]][0] ** 2) + z
900                myvertex[alt[7]][2] = sqrt(r ** 2 - myvertex[alt[7]][0] ** 2) + z
901                d1 = []
902                d2 = []
903                t1 = []
904                t2 = []
905                for i in range(0, res):
906                    a = i * pi / res
907                    y1 = cos(a) * r
908                    y2 = -cos(a) * k
909                    if x1 < y1 < x2:
910                        myvertex.extend([[y1, fr - k3, sin(a) * r + z], [y1, fr + k3, sin(a) * r + z]])
911                        t1.append(len(myvertex) - 2)
912                        t2.append(len(myvertex) - 1)
913                        ftl.extend([len(myfaces) - 1, len(myfaces) - 2])
914                    if x1 + k3 * 2 < y2 < x2 - k3 * 2:
915                        myvertex.extend([[y2, fr - k3, sin(a) * k + z], [y2, fr + k3, sin(a) * k + z]])
916                        d1.append(len(myvertex) - 2)
917                        d2.append(len(myvertex) - 1)
918                        ftl.extend([len(myfaces) - 1, len(myfaces) - 2])
919                on = [alt[1], alt[0]]
920                on.extend(t1)
921                on.extend([alt[4], alt[5]])
922                on.extend(d1)
923                ar = [alt[2], alt[3]]
924                ar.extend(t2)
925                ar.extend([alt[7], alt[6]])
926                ar.extend(d2)
927                ar.reverse()
928
929                if not d1:
930                    myfaces.extend([on, ar, [alt[5], alt[6], alt[2], alt[1]]])
931                    m = len(myfaces)
932                    ftl.extend([m - 1, m - 2, m - 3])
933                    sm.extend([m - 1])
934                else:
935                    myfaces.extend([on, ar, [alt[5], alt[6], d2[0], d1[0]], [alt[2], alt[1], d1[-1], d2[-1]]])
936                    m = len(myfaces)
937                    ftl.extend([m - 1, m - 2, m - 3, m - 4])
938                    sm.extend([m - 1, m - 2])
939
940                for i in range(0, len(d1) - 1):
941                    myfaces.append([d1[i + 1], d1[i], d2[i], d2[i + 1]])
942                    ftl.append(len(myfaces) - 1)
943                    sm.append(len(myfaces) - 1)
944                # Cam
945                x1 = xlist[x * 2 + 1] + ek + k3 * 2
946                x2 = xlist[x * 2 + 2] - ek - k3 * 2
947                on = []
948                ar = []
949                for i in range(0, res):
950                    a = i * pi / res
951                    y1 = -cos(a) * k
952                    if x1 < y1 < x2:
953                        myvertex.extend([[y1, fr - 0.005, sin(a) * k + z], [y1, fr + 0.005, sin(a) * k + z]])
954                        n = len(myvertex)
955                        on.append(n - 1)
956                        ar.append(n - 2)
957                myvertex.extend(
958                    [[x1, fr - 0.005, sqrt(k ** 2 - x1 ** 2) + z], [x1, fr + 0.005,
959                                                                         sqrt(k ** 2 - x1 ** 2) + z]])
960                myvertex.extend([[x1, fr - 0.005, zlist[-3] + ek + k3 * 2], [x1, fr + 0.005, zlist[-3] + ek + k3 * 2]])
961                myvertex.extend([[x2, fr - 0.005, zlist[-3] + ek + k3 * 2], [x2, fr + 0.005, zlist[-3] + ek + k3 * 2]])
962                myvertex.extend(
963                    [[x2, fr - 0.005, sqrt(k ** 2 - x2 ** 2) + z], [x2, fr + 0.005,
964                                                                         sqrt(k ** 2 - x2 ** 2) + z]])
965                n = len(myvertex)
966                on.extend([n - 1, n - 3, n - 5, n - 7])
967                ar.extend([n - 2, n - 4, n - 6, n - 8])
968                myfaces.append(on)
969                ar.reverse()
970                myfaces.append(ar)
971                m = len(myfaces)
972                cam.extend([m - 1, m - 2])
973
974        elif op.UST == '3':  # Egri
975            if op.DT3 == '1':
976                h1 = (op.VL1 / 200) / u
977            elif op.DT3 == '2':
978                h1 = op.VL3 / 100
979            elif op.DT3 == '3':
980                h1 = sin(op.VL4 * pi / 180) / cos(op.VL4 * pi / 180)
981            z = sqrt(k1 ** 2 + (k1 * h1) ** 2)
982            k = sqrt(k2 ** 2 + (k2 * h1) ** 2)
983            f = sqrt(k3 ** 2 + (k3 * h1) ** 2) * 2
984            myvertex[ust[0]][2] = zlist[-1] + myvertex[ust[0]][0] * h1
985            myvertex[ust[1]][2] = zlist[-1] + myvertex[ust[1]][0] * h1
986            for i in alt:
987                myvertex[i][2] = zlist[-1] + myvertex[i][0] * h1 - z
988            myvertex[son[0]][2] = zlist[-1] + myvertex[son[0]][0] * h1
989            myvertex[son[1]][2] = zlist[-1] + myvertex[son[1]][0] * h1
990            myfaces.append([ust[1], ust[0], son[0], son[1]])
991            for i in range(0, mx * 4, 4):
992                myfaces.append([alt[i], alt[i + 1], alt[i + 3], alt[i + 2]])
993            on = [ust[0]]
994            ar = [ust[1]]
995            for i in range(0, len(alt) - 1, 2):
996                on.append(alt[i])
997                ar.append(alt[i + 1])
998            on.append(son[0])
999            myfaces.append(on)
1000            ar.append(son[1])
1001            ar.reverse()
1002            myfaces.append(ar)
1003            y = my - 1
1004            for x in range(0, mx):
1005                if kx[x][y] is True:
1006                    kapak(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k2 / 2, (k1 + k2) * 0.5 - 0.01)
1007                    n = len(myvertex)
1008                    myvertex[n - 5][2] = zlist[-1] + myvertex[n - 5][0] * h1 - z
1009                    myvertex[n - 6][2] = zlist[-1] + myvertex[n - 6][0] * h1 - z - k
1010                    myvertex[n - 7][2] = zlist[-1] + myvertex[n - 7][0] * h1 - z - k
1011                    myvertex[n - 8][2] = zlist[-1] + myvertex[n - 8][0] * h1 - z
1012                    myvertex[n - 9][2] = zlist[-1] + myvertex[n - 9][0] * h1 - z
1013                    myvertex[n - 10][2] = zlist[-1] + myvertex[n - 10][0] * h1 - z - k
1014                    myvertex[n - 11][2] = zlist[-1] + myvertex[n - 11][0] * h1 - z - k
1015                    myvertex[n - 12][2] = zlist[-1] + myvertex[n - 12][0] * h1 - z
1016                    fitil(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k3, (k1 + k2) * 0.5 - 0.01, k2)
1017                    n = len(myvertex)
1018                    myvertex[n - 2][2] = zlist[-1] + myvertex[n - 2][0] * h1 - z - k - f
1019                    myvertex[n - 3][2] = zlist[-1] + myvertex[n - 3][0] * h1 - z - k - f
1020                    myvertex[n - 6][2] = zlist[-1] + myvertex[n - 6][0] * h1 - z - k - f
1021                    myvertex[n - 7][2] = zlist[-1] + myvertex[n - 7][0] * h1 - z - k - f
1022                    myvertex[n - 13][2] = zlist[-1] + myvertex[n - 13][0] * h1 - z - k
1023                    myvertex[n - 14][2] = zlist[-1] + myvertex[n - 14][0] * h1 - z - k - f
1024                    myvertex[n - 15][2] = zlist[-1] + myvertex[n - 15][0] * h1 - z - k - f
1025                    myvertex[n - 16][2] = zlist[-1] + myvertex[n - 16][0] * h1 - z - k
1026                    myvertex[n - 17][2] = zlist[-1] + myvertex[n - 17][0] * h1 - z - k
1027                    myvertex[n - 18][2] = zlist[-1] + myvertex[n - 18][0] * h1 - z - k - f
1028                    myvertex[n - 19][2] = zlist[-1] + myvertex[n - 19][0] * h1 - z - k - f
1029                    myvertex[n - 20][2] = zlist[-1] + myvertex[n - 20][0] * h1 - z - k
1030                else:
1031                    fitil(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k3, 0, 0)
1032                    n = len(myvertex)
1033                    myvertex[n - 2][2] = zlist[-1] + myvertex[n - 2][0] * h1 - z - f
1034                    myvertex[n - 3][2] = zlist[-1] + myvertex[n - 3][0] * h1 - z - f
1035                    myvertex[n - 6][2] = zlist[-1] + myvertex[n - 6][0] * h1 - z - f
1036                    myvertex[n - 7][2] = zlist[-1] + myvertex[n - 7][0] * h1 - z - f
1037                    myvertex[n - 13][2] = zlist[-1] + myvertex[n - 13][0] * h1 - z
1038                    myvertex[n - 14][2] = zlist[-1] + myvertex[n - 14][0] * h1 - z - f
1039                    myvertex[n - 15][2] = zlist[-1] + myvertex[n - 15][0] * h1 - z - f
1040                    myvertex[n - 16][2] = zlist[-1] + myvertex[n - 16][0] * h1 - z
1041                    myvertex[n - 17][2] = zlist[-1] + myvertex[n - 17][0] * h1 - z
1042                    myvertex[n - 18][2] = zlist[-1] + myvertex[n - 18][0] * h1 - z - f
1043                    myvertex[n - 19][2] = zlist[-1] + myvertex[n - 19][0] * h1 - z - f
1044                    myvertex[n - 20][2] = zlist[-1] + myvertex[n - 20][0] * h1 - z
1045                m = len(myfaces)
1046                cam.extend([m - 1, m - 2])
1047                ftl.extend([m - 3, m - 4, m - 5, m - 6, m - 7, m - 8, m - 9, m - 10, m - 11, m - 12, m - 13, m - 14])
1048        elif op.UST == '4':  # Ucgen
1049            if op.DT3 == '1':
1050                h1 = (op.VL1 / 100) / u
1051            elif op.DT3 == '2':
1052                h1 = op.VL3 / 100
1053            elif op.DT3 == '3':
1054                h1 = sin(op.VL4 * pi / 180) / cos(op.VL4 * pi / 180)
1055            z = sqrt(k1 ** 2 + (k1 * h1) ** 2)
1056            k = sqrt(k2 ** 2 + (k2 * h1) ** 2)
1057            f = sqrt(k3 ** 2 + (k3 * h1) ** 2) * 2
1058            myvertex[ust[0]][2] = zlist[-1] + myvertex[ust[0]][0] * h1
1059            myvertex[ust[1]][2] = zlist[-1] + myvertex[ust[1]][0] * h1
1060            for i in alt:
1061                myvertex[i][2] = zlist[-1] - abs(myvertex[i][0]) * h1 - z
1062            myvertex[son[0]][2] = zlist[-1] - myvertex[son[0]][0] * h1
1063            myvertex[son[1]][2] = zlist[-1] - myvertex[son[1]][0] * h1
1064            myvertex.extend([[0, -k1 / 2, zlist[-1]], [0, k1 / 2, zlist[-1]]])
1065
1066            x = 0
1067            for j in range(2, len(alt) - 2, 4):
1068                if myvertex[alt[j]][0] < 0 < myvertex[alt[j + 2]][0]:
1069                    x = 1
1070
1071            n = len(myvertex)
1072            myfaces.extend([[ust[1], ust[0], n - 2, n - 1], [n - 1, n - 2, son[0], son[1]]])
1073            on = [son[0], n - 2, ust[0]]
1074            ar = [son[1], n - 1, ust[1]]
1075
1076            if x == 0:
1077                myvertex.extend([[0, -k1 / 2, zlist[-1] - z], [0, k1 / 2, zlist[-1] - z]])
1078            for j in range(0, len(alt) - 2, 4):
1079                if myvertex[alt[j]][0] < 0 and myvertex[alt[j + 2]][0] < 0:
1080                    myfaces.append([alt[j], alt[j + 1], alt[j + 3], alt[j + 2]])
1081                    on.extend([alt[j], alt[j + 2]])
1082                    ar.extend([alt[j + 1], alt[j + 3]])
1083                elif myvertex[alt[j]][0] > 0 and myvertex[alt[j + 2]][0] > 0:
1084                    myfaces.append([alt[j], alt[j + 1], alt[j + 3], alt[j + 2]])
1085                    on.extend([alt[j], alt[j + 2]])
1086                    ar.extend([alt[j + 1], alt[j + 3]])
1087                else:
1088                    n = len(myvertex)
1089                    myfaces.extend([[alt[j], alt[j + 1], n - 1, n - 2], [n - 2, n - 1, alt[j + 3], alt[j + 2]]])
1090                    on.extend([alt[j + 0], n - 2, alt[j + 2]])
1091                    ar.extend([alt[j + 1], n - 1, alt[j + 3]])
1092            myfaces.append(on)
1093            ar.reverse()
1094            myfaces.append(ar)
1095            y = my - 1
1096            for x in range(0, mx):
1097                if myvertex[alt[x * 4]][0] < 0 and myvertex[alt[x * 4 + 2]][0] < 0:
1098                    if kx[x][y] is True:
1099                        kapak(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k2 / 2, (k1 + k2) * 0.5 - 0.01)
1100                        n = len(myvertex)
1101                        myvertex[n - 5][2] = zlist[-1] + myvertex[n - 5][0] * h1 - z
1102                        myvertex[n - 6][2] = zlist[-1] + myvertex[n - 6][0] * h1 - z - k
1103                        myvertex[n - 7][2] = zlist[-1] + myvertex[n - 7][0] * h1 - z - k
1104                        myvertex[n - 8][2] = zlist[-1] + myvertex[n - 8][0] * h1 - z
1105                        myvertex[n - 9][2] = zlist[-1] + myvertex[n - 9][0] * h1 - z
1106                        myvertex[n - 10][2] = zlist[-1] + myvertex[n - 10][0] * h1 - z - k
1107                        myvertex[n - 11][2] = zlist[-1] + myvertex[n - 11][0] * h1 - z - k
1108                        myvertex[n - 12][2] = zlist[-1] + myvertex[n - 12][0] * h1 - z
1109                        fitil(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k3, (k1 + k2) * 0.5 - 0.01, k2)
1110                        n = len(myvertex)
1111                        myvertex[n - 2][2] = zlist[-1] + myvertex[n - 2][0] * h1 - z - k - f
1112                        myvertex[n - 3][2] = zlist[-1] + myvertex[n - 3][0] * h1 - z - k - f
1113                        myvertex[n - 6][2] = zlist[-1] + myvertex[n - 6][0] * h1 - z - k - f
1114                        myvertex[n - 7][2] = zlist[-1] + myvertex[n - 7][0] * h1 - z - k - f
1115                        myvertex[n - 13][2] = zlist[-1] + myvertex[n - 13][0] * h1 - z - k
1116                        myvertex[n - 14][2] = zlist[-1] + myvertex[n - 14][0] * h1 - z - k - f
1117                        myvertex[n - 15][2] = zlist[-1] + myvertex[n - 15][0] * h1 - z - k - f
1118                        myvertex[n - 16][2] = zlist[-1] + myvertex[n - 16][0] * h1 - z - k
1119                        myvertex[n - 17][2] = zlist[-1] + myvertex[n - 17][0] * h1 - z - k
1120                        myvertex[n - 18][2] = zlist[-1] + myvertex[n - 18][0] * h1 - z - k - f
1121                        myvertex[n - 19][2] = zlist[-1] + myvertex[n - 19][0] * h1 - z - k - f
1122                        myvertex[n - 20][2] = zlist[-1] + myvertex[n - 20][0] * h1 - z - k
1123                    else:
1124                        fitil(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k3, 0, 0)
1125                        n = len(myvertex)
1126                        myvertex[n - 2][2] = zlist[-1] + myvertex[n - 2][0] * h1 - z - f
1127                        myvertex[n - 3][2] = zlist[-1] + myvertex[n - 3][0] * h1 - z - f
1128                        myvertex[n - 6][2] = zlist[-1] + myvertex[n - 6][0] * h1 - z - f
1129                        myvertex[n - 7][2] = zlist[-1] + myvertex[n - 7][0] * h1 - z - f
1130                        myvertex[n - 13][2] = zlist[-1] + myvertex[n - 13][0] * h1 - z
1131                        myvertex[n - 14][2] = zlist[-1] + myvertex[n - 14][0] * h1 - z - f
1132                        myvertex[n - 15][2] = zlist[-1] + myvertex[n - 15][0] * h1 - z - f
1133                        myvertex[n - 16][2] = zlist[-1] + myvertex[n - 16][0] * h1 - z
1134                        myvertex[n - 17][2] = zlist[-1] + myvertex[n - 17][0] * h1 - z
1135                        myvertex[n - 18][2] = zlist[-1] + myvertex[n - 18][0] * h1 - z - f
1136                        myvertex[n - 19][2] = zlist[-1] + myvertex[n - 19][0] * h1 - z - f
1137                        myvertex[n - 20][2] = zlist[-1] + myvertex[n - 20][0] * h1 - z
1138                    m = len(myfaces)
1139                    cam.extend([m - 1, m - 2])
1140                    ftl.extend([m - 3, m - 4, m - 5, m - 6, m - 7, m - 8, m - 9, m - 10, m - 11,
1141                                m - 12, m - 13, m - 14])
1142                elif myvertex[alt[x * 4]][0] > 0 and myvertex[alt[x * 4 + 2]][0] > 0:
1143                    if kx[x][y] is True:
1144                        kapak(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k2 / 2, (k1 + k2) * 0.5 - 0.01)
1145                        n = len(myvertex)
1146                        myvertex[n - 5][2] = zlist[-1] - myvertex[n - 5][0] * h1 - z
1147                        myvertex[n - 6][2] = zlist[-1] - myvertex[n - 6][0] * h1 - z - k
1148                        myvertex[n - 7][2] = zlist[-1] - myvertex[n - 7][0] * h1 - z - k
1149                        myvertex[n - 8][2] = zlist[-1] - myvertex[n - 8][0] * h1 - z
1150                        myvertex[n - 9][2] = zlist[-1] - myvertex[n - 9][0] * h1 - z
1151                        myvertex[n - 10][2] = zlist[-1] - myvertex[n - 10][0] * h1 - z - k
1152                        myvertex[n - 11][2] = zlist[-1] - myvertex[n - 11][0] * h1 - z - k
1153                        myvertex[n - 12][2] = zlist[-1] - myvertex[n - 12][0] * h1 - z
1154                        fitil(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k3, (k1 + k2) * 0.5 - 0.01, k2)
1155                        n = len(myvertex)
1156                        myvertex[n - 2][2] = zlist[-1] - myvertex[n - 2][0] * h1 - z - k - f
1157                        myvertex[n - 3][2] = zlist[-1] - myvertex[n - 3][0] * h1 - z - k - f
1158                        myvertex[n - 6][2] = zlist[-1] - myvertex[n - 6][0] * h1 - z - k - f
1159                        myvertex[n - 7][2] = zlist[-1] - myvertex[n - 7][0] * h1 - z - k - f
1160                        myvertex[n - 13][2] = zlist[-1] - myvertex[n - 13][0] * h1 - z - k
1161                        myvertex[n - 14][2] = zlist[-1] - myvertex[n - 14][0] * h1 - z - k - f
1162                        myvertex[n - 15][2] = zlist[-1] - myvertex[n - 15][0] * h1 - z - k - f
1163                        myvertex[n - 16][2] = zlist[-1] - myvertex[n - 16][0] * h1 - z - k
1164                        myvertex[n - 17][2] = zlist[-1] - myvertex[n - 17][0] * h1 - z - k
1165                        myvertex[n - 18][2] = zlist[-1] - myvertex[n - 18][0] * h1 - z - k - f
1166                        myvertex[n - 19][2] = zlist[-1] - myvertex[n - 19][0] * h1 - z - k - f
1167                        myvertex[n - 20][2] = zlist[-1] - myvertex[n - 20][0] * h1 - z - k
1168                    else:
1169                        fitil(myvertex, myfaces, xlist, zlist, x * 2 + 1, y * 2 + 1, k3, 0, 0)
1170                        n = len(myvertex)
1171                        myvertex[n - 2][2] = zlist[-1] - myvertex[n - 2][0] * h1 - z - f
1172                        myvertex[n - 3][2] = zlist[-1] - myvertex[n - 3][0] * h1 - z - f
1173                        myvertex[n - 6][2] = zlist[-1] - myvertex[n - 6][0] * h1 - z - f
1174                        myvertex[n - 7][2] = zlist[-1] - myvertex[n - 7][0] * h1 - z - f
1175                        myvertex[n - 13][2] = zlist[-1] - myvertex[n - 13][0] * h1 - z
1176                        myvertex[n - 14][2] = zlist[-1] - myvertex[n - 14][0] * h1 - z - f
1177                        myvertex[n - 15][2] = zlist[-1] - myvertex[n - 15][0] * h1 - z - f
1178                        myvertex[n - 16][2] = zlist[-1] - myvertex[n - 16][0] * h1 - z
1179                        myvertex[n - 17][2] = zlist[-1] - myvertex[n - 17][0] * h1 - z
1180                        myvertex[n - 18][2] = zlist[-1] - myvertex[n - 18][0] * h1 - z - f
1181                        myvertex[n - 19][2] = zlist[-1] - myvertex[n - 19][0] * h1 - z - f
1182                        myvertex[n - 20][2] = zlist[-1] - myvertex[n - 20][0] * h1 - z
1183                    m = len(myfaces)
1184                    cam.extend([m - 1, m - 2])
1185                    ftl.extend([m - 3, m - 4, m - 5, m - 6, m - 7, m - 8, m - 9, m - 10,
1186                                m - 11, m - 12, m - 13, m - 14])
1187                else:
1188                    k4 = k3 * 2
1189                    if kx[x][y] is True:
1190                        zz = (k1 + k2) * 0.5 - 0.01
1191                        xx = xlist[x * 2 + 1]
1192                        myvertex.extend([[xx, -k2 / 2 + zz, zlist[-3]], [xx + k2, -k2 / 2 + zz, zlist[-3] + k2],
1193                                         [xx + k2, k2 / 2 + zz, zlist[-3] + k2], [xx, k2 / 2 + zz, zlist[-3]]])
1194                        myvertex.extend(
1195                            [[xx, -k2 / 2 + zz, zlist[-1] + xx * h1 - z], [xx + k2, -k2 / 2 + zz,
1196                                                                           zlist[-1] + (xx + k2) * h1 - z - k],
1197                             [xx + k2, k2 / 2 + zz, zlist[-1] + (xx + k2) * h1 - z - k],
1198                             [xx, k2 / 2 + zz, zlist[-1] + xx * h1 - z]])
1199                        myvertex.extend([[0, -k2 / 2 + zz, zlist[-1] - z], [0, -k2 / 2 + zz, zlist[-1] - z - k],
1200                                         [0, k2 / 2 + zz, zlist[-1] - z - k], [0, k2 / 2 + zz, zlist[-1] - z]])
1201                        xx = xlist[x * 2 + 2]
1202                        myvertex.extend(
1203                            [[xx, -k2 / 2 + zz, zlist[-1] - xx * h1 - z], [xx - k2, -k2 / 2 + zz,
1204                                                                           zlist[-1] - (xx - k2) * h1 - z - k],
1205                             [xx - k2, k2 / 2 + zz, zlist[-1] - (xx - k2) * h1 - z - k],
1206                             [xx, k2 / 2 + zz, zlist[-1] - xx * h1 - z]])
1207                        myvertex.extend([[xx, -k2 / 2 + zz, zlist[-3]], [xx - k2, -k2 / 2 + zz, zlist[-3] + k2],
1208                                         [xx - k2, k2 / 2 + zz, zlist[-3] + k2], [xx, k2 / 2 + zz, zlist[-3]]])
1209                        n = len(myvertex)
1210                        myfaces.extend([[n - 20, n - 19, n - 15, n - 16], [n - 19, n - 18, n - 14, n - 15],
1211                                        [n - 18, n - 17, n - 13, n - 14], [n - 17, n - 20, n - 16, n - 13]])
1212                        myfaces.extend([[n - 16, n - 15, n - 11, n - 12], [n - 15, n - 14, n - 10, n - 11],
1213                                        [n - 14, n - 13, n - 9, n - 10], [n - 13, n - 16, n - 12, n - 9]])
1214                        myfaces.extend(
1215                            [[n - 12, n - 11, n - 7, n - 8], [n - 11, n - 10, n - 6, n - 7], [n - 10, n - 9,
1216                                                                                              n - 5, n - 6],
1217                             [n - 9, n - 12, n - 8, n - 5]])
1218                        myfaces.extend(
1219                            [[n - 8, n - 7, n - 3, n - 4], [n - 7, n - 6, n - 2, n - 3], [n - 6, n - 5, n - 1, n - 2],
1220                             [n - 5, n - 8, n - 4, n - 1]])
1221                        myfaces.extend(
1222                            [[n - 4, n - 3, n - 19, n - 20], [n - 3, n - 2, n - 18, n - 19],
1223                             [n - 2, n - 1, n - 17, n - 18],
1224                             [n - 1, n - 4, n - 20, n - 17]])
1225                        xx = xlist[x * 2 + 1]
1226                        myvertex.extend([[xx + k2, -k3 + zz, zlist[-3] + k2], [xx + k4 + k2, -k3 + zz,
1227                                                                               zlist[-3] + k2 + k4],
1228                                         [xx + k4 + k2, k3 + zz, zlist[-3] + k2 + k4], [xx + k2, k3 + zz,
1229                                                                                        zlist[-3] + k2]])
1230                        myvertex.extend([[xx + k2, -k3 + zz, zlist[-1] + (xx + k2) * h1 - z - k],
1231                                         [xx + k4 + k2, -k3 + zz, zlist[-1] + (xx + k2 + k4) * h1 - z - k - f],
1232                                         [xx + k4 + k2, k3 + zz, zlist[-1] + (xx + k2 + k4) * h1 - z - k - f],
1233                                         [xx + k2, k3 + zz, zlist[-1] + (xx + k2) * h1 - z - k]])
1234                        myvertex.extend([[0, -k3 + zz, zlist[-1] - k - z], [0, -k3 + zz, zlist[-1] - k - z - f],
1235                                         [0, k3 + zz, zlist[-1] - k - z - f], [0, k3 + zz, zlist[-1] - k - z]])
1236                        xx = xlist[x * 2 + 2]
1237                        myvertex.extend([[xx - k2, -k3 + zz, zlist[-1] - (xx - k2) * h1 - z - k],
1238                                         [xx - k4 - k2, -k3 + zz, zlist[-1] - (xx - k2 - k4) * h1 - z - k - f],
1239                                         [xx - k4 - k2, k3 + zz, zlist[-1] - (xx - k2 - k4) * h1 - z - k - f],
1240                                         [xx - k2, k3 + zz, zlist[-1] - (xx - k2) * h1 - z - k]])
1241                        myvertex.extend([[xx - k2, -k3 + zz, zlist[-3] + k2],
1242                                         [xx - k4 - k2, -k3 + zz, zlist[-3] + k2 + k4],
1243                                         [xx - k4 - k2, k3 + zz, zlist[-3] + k2 + k4],
1244                                         [xx - k2, k3 + zz, zlist[-3] + k2]])
1245                        n = len(myvertex)
1246                        myfaces.extend([[n - 20, n - 19, n - 15, n - 16], [n - 19, n - 18, n - 14, n - 15],
1247                                        [n - 18, n - 17, n - 13, n - 14]])
1248                        myfaces.extend([[n - 16, n - 15, n - 11, n - 12], [n - 15, n - 14, n - 10, n - 11],
1249                                        [n - 14, n - 13, n - 9, n - 10]])
1250                        myfaces.extend(
1251                            [[n - 12, n - 11, n - 7, n - 8], [n - 11, n - 10, n - 6, n - 7], [n - 10,
1252                                                                                              n - 9, n - 5, n - 6]])
1253                        myfaces.extend(
1254                            [[n - 8, n - 7, n - 3, n - 4], [n - 7, n - 6, n - 2, n - 3], [n - 6, n - 5, n - 1, n - 2]])
1255                        myfaces.extend([[n - 4, n - 3, n - 19, n - 20], [n - 3, n - 2, n - 18, n - 19],
1256                                        [n - 2, n - 1, n - 17, n - 18]])
1257                        xx = xlist[x * 2 + 1]
1258                        myvertex.extend(
1259                            [[xx + k4 + k2, -k3 + zz, zlist[-3] + k2 + k4], [xx + k4 + k2, k3 + zz, zlist[-3] +
1260                                                                             k2 + k4]])
1261                        myvertex.extend([[xx + k4 + k2, -k3 + zz, zlist[-1] + (xx + k2 + k4) * h1 - z - k - f],
1262                                         [xx + k4 + k2, k3 + zz, zlist[-1] + (xx + k2 + k4) * h1 - z - k - f]])
1263                        myvertex.extend([[0, -k3 + zz, zlist[-1] - k - z - f], [0, k3 + zz, zlist[-1] - k - z - f]])
1264                        xx = xlist[x * 2 + 2]
1265                        myvertex.extend([[xx - k4 - k2, -k3 + zz, zlist[-1] - (xx - k2 - k4) * h1 - z - k - f],
1266                                         [xx - k4 - k2, k3 + zz, zlist[-1] - (xx - k2 - k4) * h1 - z - k - f]])
1267                        myvertex.extend(
1268                            [[xx - k4 - k2, -k3 + zz, zlist[-3] + k2 + k4], [xx - k4 - k2, k3 + zz, zlist[-3] +
1269                                                                             k2 + k4]])
1270                        myfaces.extend([[n + 8, n + 6, n + 4, n + 2, n + 0], [n + 1, n + 3, n + 5, n + 7, n + 9]])
1271                    else:
1272                        xx = xlist[x * 2 + 1]
1273                        myvertex.extend(
1274                            [[xx, -k3, zlist[-3]], [xx + k4, -k3, zlist[-3] + k4], [xx + k4, k3, zlist[-3] + k4],
1275                             [xx, k3, zlist[-3]]])
1276                        myvertex.extend(
1277                            [[xx, -k3, zlist[-1] + xx * h1 - z], [xx + k4, -k3, zlist[-1] + (xx + k4) * h1 - z - f],
1278                             [xx + k4, k3, zlist[-1] + (xx + k4) * h1 - z - f], [xx, k3, zlist[-1] + xx * h1 - z]])
1279                        myvertex.extend(
1280                            [[0, -k3, zlist[-1] - z], [0, -k3, zlist[-1] - z - f], [0, k3, zlist[-1] - z - f],
1281                             [0, k3, zlist[-1] - z]])
1282                        xx = xlist[x * 2 + 2]
1283                        myvertex.extend(
1284                            [[xx, -k3, zlist[-1] - xx * h1 - z], [xx - k4, -k3, zlist[-1] - (xx - k4) * h1 - z - f],
1285                             [xx - k4, k3, zlist[-1] - (xx - k4) * h1 - z - f], [xx, k3, zlist[-1] - xx * h1 - z]])
1286                        myvertex.extend(
1287                            [[xx, -k3, zlist[-3]], [xx - k4, -k3, zlist[-3] + k4], [xx - k4, k3, zlist[-3] + k4],
1288                             [xx, k3, zlist[-3]]])
1289                        n = len(myvertex)
1290                        myfaces.extend([[n - 20, n - 19, n - 15, n - 16], [n - 19, n - 18, n - 14, n - 15],
1291                                        [n - 18, n - 17, n - 13, n - 14]])
1292                        myfaces.extend([[n - 16, n - 15, n - 11, n - 12], [n - 15, n - 14, n - 10, n - 11],
1293                                        [n - 14, n - 13, n - 9, n - 10]])
1294                        myfaces.extend(
1295                            [[n - 12, n - 11, n - 7, n - 8], [n - 11, n - 10, n - 6, n - 7], [n - 10, n - 9, n - 5,
1296                                                                                              n - 6]])
1297                        myfaces.extend(
1298                            [[n - 8, n - 7, n - 3, n - 4], [n - 7, n - 6, n - 2, n - 3], [n - 6, n - 5, n - 1, n - 2]])
1299                        myfaces.extend([[n - 4, n - 3, n - 19, n - 20], [n - 3, n - 2, n - 18, n - 19],
1300                                        [n - 2, n - 1, n - 17, n - 18]])
1301                        xx = xlist[x * 2 + 1]
1302                        myvertex.extend([[xx + k4, -0.005, zlist[-3] + k4], [xx + k4, 0.005, zlist[-3] + k4]])
1303                        myvertex.extend([[xx + k4, -0.005, zlist[-1] + (xx + k4) * h1 - z - f],
1304                                         [xx + k4, 0.005, zlist[-1] + (xx + k4) * h1 - z - f]])
1305                        myvertex.extend([[0, -0.005, zlist[-1] - z - f], [0, 0.005, zlist[-1] - z - f]])
1306                        xx = xlist[x * 2 + 2]
1307                        myvertex.extend([[xx - k4, -0.005, zlist[-1] - (xx - k4) * h1 - z - f],
1308                                         [xx - k4, 0.005, zlist[-1] - (xx - k4) * h1 - z - f]])
1309                        myvertex.extend([[xx - k4, -0.005, zlist[-3] + k4], [xx - k4, 0.005, zlist[-3] + k4]])
1310                        myfaces.extend([[n + 8, n + 6, n + 4, n + 2, n + 0], [n + 1, n + 3, n + 5, n + 7, n + 9]])
1311                    m = len(myfaces)
1312                    cam.extend([m - 1, m - 2])
1313                    ftl.extend(
1314                        [m - 3, m - 4, m - 5, m - 6, m - 7, m - 8, m - 9, m - 10, m - 11, m - 12, m - 13,
1315                         m - 14, m - 15,
1316                         m - 16, m - 17])
1317        # Mermer
1318        if op.mr is True:
1319            mrh = -op.mr1 / 100
1320            mrg = op.mr2 / 100
1321            mdv = (op.mr3 / 200) + mrg
1322            msv = -(mdv + (op.mr4 / 100))
1323            myvertex.extend([[-u, mdv, 0], [u, mdv, 0], [-u, msv, 0], [u, msv, 0], [-u, mdv, mrh], [u, mdv, mrh],
1324                             [-u, msv, mrh],
1325                             [u, msv, mrh]])
1326            n = len(myvertex)
1327            myfaces.extend([[n - 1, n - 2, n - 4, n - 3], [n - 3, n - 4, n - 8, n - 7], [n - 6, n - 5, n - 7, n - 8],
1328                            [n - 2, n - 1, n - 5, n - 6], [n - 4, n - 2, n - 6, n - 8], [n - 5, n - 1, n - 3, n - 7]])
1329            n = len(myfaces)
1330            mer.extend([n - 1, n - 2, n - 3, n - 4, n - 5, n - 6])
1331
1332        return True, ftl, cam, mer, sm
1333    except:
1334        return False, None, None, None, None
1335
1336
1337# ------------------------------------
1338# Get highest points of the panel
1339# ------------------------------------
1340def get_high_points(selobject, width, tip):
1341    obverts = selobject.data.vertices
1342
1343    top_a = 0
1344    top_b = 0
1345    top_c = 0
1346    # --------------------------
1347    # Recover all vertex
1348    # --------------------------
1349    for vertex in obverts:
1350        if vertex.co[0] == -width / 2:
1351            if vertex.co[2] >= top_a:
1352                top_a = vertex.co[2]
1353        if vertex.co[0] == width / 2:
1354            if vertex.co[2] >= top_b:
1355                top_b = vertex.co[2]
1356        # top center
1357        if tip == "2":
1358            if vertex.co[2] >= top_c:
1359                top_c = vertex.co[2]
1360        else:
1361            if vertex.co[0] == 0 and vertex.co[2] >= top_c:
1362                top_c = vertex.co[2]
1363
1364    return top_a, top_b, top_c
1365
1366
1367# ---------------------------------------------------------
1368# Defines a point
1369# ---------------------------------------------------------
1370class Cpoint:
1371
1372    def __init__(self, x, y):
1373        self.x = float(x)
1374        self.y = float(y)
1375
1376
1377# ---------------------------------------------------------
1378# Get angle between two vectors
1379# ---------------------------------------------------------
1380def get_angle(p1, p2):
1381    v1 = Vector((p1[0], 0.0, p1[1]))
1382    v2 = Vector((p2[0], 0.0, p2[1]))
1383
1384    a = v1.angle(v2)
1385    return a
1386
1387
1388# ---------------------------------------------------------
1389# Get center of circle base on 3 points
1390#
1391# Point a: (x,z)
1392# Point b: (x,z)
1393# Point c: (x,z)
1394# Return:
1395# x, y: center position
1396#  r: radio
1397# ang: angle
1398# ---------------------------------------------------------
1399def get_circle_center(a, b, c):
1400    try:
1401        # line between a and b: s1 + k * d1
1402        s1 = Cpoint((a.x + b.x) / 2.0, (a.y + b.y) / 2.0)
1403        d1 = Cpoint(b.y - a.y, a.x - b.x)
1404        # line between a and c: s2 + k * d2
1405        s2 = Cpoint((a.x + c.x) / 2.0, (a.y + c.y) / 2.0)
1406        d2 = Cpoint(c.y - a.y, a.x - c.x)
1407        # intersection of both lines:
1408        l = d1.x * (s2.y - s1.y) - d1.y * (s2.x - s1.x)
1409        l /= d2.x * d1.y - d2.y * d1.x
1410        center = Cpoint(s2.x + l * d2.x, s2.y + l * d2.y)
1411        dx = center.x - a.x
1412        dy = center.y - a.y
1413        radio = sqrt(dx * dx + dy * dy)
1414
1415        # angle
1416        v1 = (a.x - center.x, a.y - center.y)
1417        v2 = (b.x - center.x, b.y - center.y)
1418        ang = get_angle(v1, v2)
1419        return center, radio, ang
1420    except ZeroDivisionError:
1421        return Cpoint(0, 0), 1, 1
1422
1423
1424# -----------------------------------------
1425# Get limits
1426# lb, rb: limits x
1427# lt, rt: limits z
1428# mp: limit z in med point
1429# lo: Z low limit
1430# my: max y
1431# top: top vertex
1432# -----------------------------------------
1433def get_limits(myobject):
1434    verts = myobject.data.vertices
1435
1436    lb = 0
1437    lt = 0
1438    rb = 0
1439    rt = 0
1440    mp = 0
1441    lo = 0
1442    my = 0
1443    top = 0
1444    for v in verts:
1445        if v.co[2] > top:
1446            top = v.co[2]
1447
1448        if v.co[2] < lo:
1449            lo = v.co[2]
1450
1451        if v.co[1] > my:
1452            my = v.co[1]
1453        if v.co[0] > rb:
1454            rb = v.co[0]
1455        if v.co[0] < lb:
1456            lb = v.co[0]
1457        if v.co[0] == 0:
1458            if v.co[2] > mp:
1459                mp = v.co[2]
1460    # max sides
1461    for v in verts:
1462        if v.co[2] > lt and v.co[0] == lb:
1463            lt = v.co[2]
1464        if v.co[2] > rt and v.co[0] == rb:
1465            rt = v.co[2]
1466
1467    return lb, lt, rb, rt, mp, lo, my, top
1468
1469
1470# ------------------------------------------
1471# Create control box for panels
1472#
1473# ------------------------------------------
1474def create_ctrl_box(parentobj, objname):
1475    myvertex = []
1476    myfaces = []
1477
1478    o = parentobj
1479    op = o.WindowPanelGenerator[0]
1480
1481    lb, lt, rb, rt, mp, lo, my, top = get_limits(o)
1482    ypos = my * 1.8
1483    # -----------------------------
1484    # Flat, Triangle and inclined
1485    # -----------------------------
1486    if op.UST == "1" or op.UST == "3" or op.UST == "4":
1487        if mp == 0:
1488            myvertex.extend([(lb, ypos, lo), (lb, ypos, lt), (rb, ypos, rt), (rb, ypos, lo)])
1489            myvertex.extend([(lb, -ypos, lo), (lb, -ypos, lt), (rb, -ypos, rt), (rb, -ypos, lo)])
1490            myfaces.extend([(0, 4, 5, 1), (3, 2, 6, 7), (0, 1, 2, 3), (4, 7, 6, 5), (1, 5, 6, 2), (0, 3, 7, 4)])
1491        else:
1492            myvertex.extend([(lb, ypos, lo), (lb, ypos, lt), (0, ypos, mp), (rb, ypos, rt), (rb, ypos, lo)])
1493            myvertex.extend([(lb, -ypos, lo), (lb, -ypos, lt), (0, -ypos, mp), (rb, -ypos, rt), (rb, -ypos, lo)])
1494            myfaces.extend([(0, 5, 6, 1), (4, 3, 8, 9), (0, 1, 2, 3, 4), (9, 8, 7, 6, 5), (1, 6, 7, 2), (2, 7, 8, 3),
1495                            (0, 4, 9, 5)])
1496    # -----------------------------
1497    # Arch
1498    # -----------------------------
1499    if op.UST == "2":
1500        center, r, ang = get_circle_center(Cpoint(lb, lt), Cpoint(0, top), Cpoint(rb, rt))
1501
1502        # cx = center.x
1503        cz = center.y
1504
1505        sg = op.res
1506        arc = ((pi / 2) + ang) - ((pi / 2) - ang)
1507        step = arc / sg
1508        a = (pi / 2) + ang
1509
1510        myvertex.extend([(lb, ypos, lt), (lb, -ypos, lt)])
1511        for x in range(0, sg):
1512            myvertex.extend([(r * cos(a), ypos, r * sin(a) + cz),
1513                             (r * cos(a), -ypos, r * sin(a) + cz)])
1514            a -= step
1515
1516        # close sides
1517        myvertex.extend([(rb, ypos, rt), (rb, -ypos, rt)])
1518
1519        v = 0
1520        nf = len(myvertex)
1521        for x in range(0, nf - 2, 2):
1522            myfaces.extend([(v, v + 1, v + 3, v + 2)])
1523            v += 2
1524
1525        nf = len(myvertex)
1526        myvertex.extend([(lb, ypos, lo), (lb, -ypos, lo)])
1527        myvertex.extend([(rb, ypos, lo), (rb, -ypos, lo)])
1528
1529        nf2 = len(myvertex)
1530        myfaces.extend([(0, nf2 - 4, nf2 - 3, 1)])
1531        myfaces.extend([(nf - 2, nf - 1, nf2 - 1, nf2 - 2)])
1532
1533        nf2 = len(myvertex)
1534        myfaces.extend([(nf2 - 4, nf2 - 2, nf2 - 1, nf2 - 3)])
1535
1536    # --------------------------
1537    # Create mesh
1538    # --------------------------
1539    myfaces = check_mesh_errors(myvertex, myfaces)
1540    mymesh = bpy.data.meshes.new(objname)
1541    myobj = bpy.data.objects.new(objname, mymesh)
1542
1543    myobj.location = bpy.context.scene.cursor.location
1544    bpy.context.collection.objects.link(myobj)
1545
1546    mymesh.from_pydata(myvertex, [], myfaces)
1547    mymesh.update(calc_edges=True)
1548
1549    return myobj
1550
1551
1552# ------------------------------------------------------------------
1553# Define property group class to create or modify
1554# ------------------------------------------------------------------
1555class GeneralPanelProperties(PropertyGroup):
1556    prs: EnumProperty(
1557            items=(
1558                ('1', "WINDOW 250X200", ""),
1559                ('2', "WINDOW 200X200", ""),
1560                ('3', "WINDOW 180X200", ""),
1561                ('4', "WINDOW 180X160", ""),
1562                ('5', "WINDOW 160X160", ""),
1563                ('6', "WINDOW 50X50", ""),
1564                ('7', "DOOR 80X250", ""),
1565                ('8', "DOOR 80X230", ""),
1566                ),
1567            name="",
1568            description='Predefined types',
1569            update=update_using_default,
1570            )
1571    son: EnumProperty(
1572            items=(
1573                ('1', "WINDOW 250X200", ""),
1574                ('2', "WINDOW 200X200", ""),
1575                ('3', "WINDOW 180X200", ""),
1576                ('4', "WINDOW 180X160", ""),
1577                ('5', "WINDOW 160X160", ""),
1578                ('6', "WINDOW 50X50", ""),
1579                ('7', "DOOR 80X250", ""),
1580                ('8', "DOOR 80X230", ""),
1581                ),
1582            name="",
1583            description='Predefined types',
1584            update=update_using_default,
1585            )
1586    gen: IntProperty(
1587            name='H Count', min=1, max=8, default=3,
1588            description='Horizontal Panes',
1589            update=update_window,
1590            )
1591    yuk: IntProperty(
1592            name='V Count', min=1, max=5, default=1,
1593            description='Vertical Panes',
1594            update=update_window,
1595            )
1596    kl1: IntProperty(
1597            name='Outer Frame', min=2, max=50, default=5,
1598            description='Outside Frame Thickness',
1599            update=update_window,
1600            )
1601    kl2: IntProperty(
1602            name='Risers', min=2, max=50, default=5,
1603            description='Risers Width',
1604            update=update_window,
1605            )
1606    fk: IntProperty(
1607            name='Inner Frame', min=1, max=20, default=2,
1608            description='Inside Frame Thickness',
1609            update=update_window,
1610            )
1611
1612    mr: BoolProperty(name='Sill', default=True, description='Window Sill', update=update_window)
1613    mr1: IntProperty(name='', min=1, max=20, default=4, description='Height', update=update_window)
1614    mr2: IntProperty(name='', min=0, max=20, default=4, description='First Depth', update=update_window)
1615    mr3: IntProperty(name='', min=1, max=50, default=20, description='Second Depth', update=update_window)
1616    mr4: IntProperty(name='', min=0, max=50, default=0, description='Extrusion for Jamb',
1617                                update=update_window)
1618
1619    mt1: EnumProperty(
1620            items=(
1621                ('1', "PVC", ""),
1622                ('2', "WOOD", ""),
1623                ('3', "Plastic", ""),
1624                ),
1625            name="",
1626            default='1',
1627            description='Material to use',
1628            update=update_window,
1629            )
1630    mt2: EnumProperty(
1631            items=(
1632                ('1', "PVC", ""),
1633                ('2', "WOOD", ""),
1634                ('3', "Plastic", ""),
1635                ),
1636            name="",
1637            default='3',
1638            description='Material to use',
1639            update=update_window,
1640            )
1641
1642    r: FloatProperty(
1643            name='Rotation',
1644            min=0, max=360, default=0, precision=1,
1645            description='Panel rotation',
1646            update=update_window,
1647            )
1648
1649    UST: EnumProperty(
1650            items=(
1651                ('1', "Flat", ""),
1652                ('2', "Arch", ""),
1653                ('3', "Inclined", ""),
1654                ('4', "Triangle", ""),
1655                ),
1656            name="Top", default='1',
1657            description='Type of window upper section',
1658            update=update_window,
1659            )
1660    DT2: EnumProperty(
1661            items=(
1662                ('1', "Difference", ""),
1663                ('2', "Radius", ""),
1664                ),
1665            name="",
1666            default='1',
1667            update=update_window,
1668            )
1669    DT3: EnumProperty(
1670            items=(
1671                ('1', "Difference", ""),
1672                ('2', "Incline %", ""),
1673                ('3', "Incline Angle", ""),
1674                ),
1675            name="",
1676            default='1', update=update_window,
1677            )
1678
1679    VL1: IntProperty(name='', min=-10000, max=10000, default=30, update=update_window)  # Fark
1680    VL2: IntProperty(name='', min=1, max=10000, default=30, update=update_window)  # Cap
1681    VL3: IntProperty(name='', min=-100, max=100, default=30, update=update_window)  # Egim %
1682    VL4: IntProperty(name='', min=-45, max=45, default=30, update=update_window)  # Egim Aci
1683
1684    res: IntProperty(name='Resolution', min=2, max=360, default=36, update=update_window)  # Res
1685
1686    gnx0: IntProperty(name='', min=1, max=300, default=60, description='1st Window Width',
1687                                 update=update_window)
1688    gnx1: IntProperty(name='', min=1, max=300, default=110, description='2nd Window Width',
1689                                 update=update_window)
1690    gnx2: IntProperty(name='', min=1, max=300, default=60, description='3rd Window Width',
1691                                 update=update_window)
1692    gnx3: IntProperty(name='', min=1, max=300, default=60, description='4th Window Width',
1693                                 update=update_window)
1694    gnx4: IntProperty(name='', min=1, max=300, default=60, description='5th Window Width',
1695                                 update=update_window)
1696    gnx5: IntProperty(name='', min=1, max=300, default=60, description='6th Window Width',
1697                                 update=update_window)
1698    gnx6: IntProperty(name='', min=1, max=300, default=60, description='7th Window Width',
1699                                 update=update_window)
1700    gnx7: IntProperty(name='', min=1, max=300, default=60, description='8th Window Width',
1701                                 update=update_window)
1702
1703    gny0: IntProperty(name='', min=1, max=300, default=190, description='1st Row Height',
1704                                 update=update_window)
1705    gny1: IntProperty(name='', min=1, max=300, default=45, description='2nd Row Height',
1706                                 update=update_window)
1707    gny2: IntProperty(name='', min=1, max=300, default=45, description='3rd Row Height',
1708                                 update=update_window)
1709    gny3: IntProperty(name='', min=1, max=300, default=45, description='4th Row Height',
1710                                 update=update_window)
1711    gny4: IntProperty(name='', min=1, max=300, default=45, description='5th Row Height',
1712                                 update=update_window)
1713
1714    k00: BoolProperty(name='', default=True, update=update_window)
1715    k01: BoolProperty(name='', default=False, update=update_window)
1716    k02: BoolProperty(name='', default=True, update=update_window)
1717    k03: BoolProperty(name='', default=False, update=update_window)
1718    k04: BoolProperty(name='', default=False, update=update_window)
1719    k05: BoolProperty(name='', default=False, update=update_window)
1720    k06: BoolProperty(name='', default=False, update=update_window)
1721    k07: BoolProperty(name='', default=False, update=update_window)
1722
1723    k10: BoolProperty(name='', default=False, update=update_window)
1724    k11: BoolProperty(name='', default=False, update=update_window)
1725    k12: BoolProperty(name='', default=False, update=update_window)
1726    k13: BoolProperty(name='', default=False, update=update_window)
1727    k14: BoolProperty(name='', default=False, update=update_window)
1728    k15: BoolProperty(name='', default=False, update=update_window)
1729    k16: BoolProperty(name='', default=False, update=update_window)
1730    k17: BoolProperty(name='', default=False, update=update_window)
1731
1732    k20: BoolProperty(name='', default=False, update=update_window)
1733    k21: BoolProperty(name='', default=False, update=update_window)
1734    k22: BoolProperty(name='', default=False, update=update_window)
1735    k23: BoolProperty(name='', default=False, update=update_window)
1736    k24: BoolProperty(name='', default=False, update=update_window)
1737    k25: BoolProperty(name='', default=False, update=update_window)
1738    k26: BoolProperty(name='', default=False, update=update_window)
1739    k27: BoolProperty(name='', default=False, update=update_window)
1740
1741    k30: BoolProperty(name='', default=False, update=update_window)
1742    k31: BoolProperty(name='', default=False, update=update_window)
1743    k32: BoolProperty(name='', default=False, update=update_window)
1744    k33: BoolProperty(name='', default=False, update=update_window)
1745    k34: BoolProperty(name='', default=False, update=update_window)
1746    k35: BoolProperty(name='', default=False, update=update_window)
1747    k36: BoolProperty(name='', default=False, update=update_window)
1748    k37: BoolProperty(name='', default=False, update=update_window)
1749
1750    k40: BoolProperty(name='', default=False, update=update_window)
1751    k41: BoolProperty(name='', default=False, update=update_window)
1752    k42: BoolProperty(name='', default=False, update=update_window)
1753    k43: BoolProperty(name='', default=False, update=update_window)
1754    k44: BoolProperty(name='', default=False, update=update_window)
1755    k45: BoolProperty(name='', default=False, update=update_window)
1756    k46: BoolProperty(name='', default=False, update=update_window)
1757    k47: BoolProperty(name='', default=False, update=update_window)
1758    # opengl internal data
1759    glpoint_a: FloatVectorProperty(
1760            name="glpointa",
1761            description="Hidden property for opengl",
1762            default=(0, 0, 0),
1763            )
1764    glpoint_b: FloatVectorProperty(
1765            name="glpointb",
1766            description="Hidden property for opengl",
1767            default=(0, 0, 0),
1768            )
1769    glpoint_c: FloatVectorProperty(
1770            name="glpointc",
1771            description="Hidden property for opengl",
1772            default=(0, 0, 0),
1773            )
1774    glpoint_d: FloatVectorProperty(
1775            name="glpointc",
1776            description="Hidden property for opengl",
1777            default=(0, 0, 0),
1778            )
1779
1780
1781bpy.utils.register_class(GeneralPanelProperties)
1782Object.WindowPanelGenerator = CollectionProperty(type=GeneralPanelProperties)
1783
1784
1785# ------------------------------------------------------------------
1786# Define panel class to modify myobjects.
1787# ------------------------------------------------------------------
1788class ARCHIMESH_PT_WindowEdit(Panel):
1789    bl_idname = "ARCHIMESH_PT_window_edit"
1790    bl_label = "Window Panel"
1791    bl_space_type = 'VIEW_3D'
1792    bl_region_type = 'UI'
1793    bl_category = 'Create'
1794
1795    # -----------------------------------------------------
1796    # Verify if visible
1797    # -----------------------------------------------------
1798    @classmethod
1799    def poll(cls, context):
1800        o = context.object
1801        if o is None:
1802            return False
1803        if 'WindowPanelGenerator' not in o:
1804            return False
1805        else:
1806            return True
1807
1808    # -----------------------------------------------------
1809    # Draw (create UI interface)
1810    # -----------------------------------------------------
1811    def draw(self, context):
1812        o = context.object
1813        # If the selected object didn't be created with the group 'WindowPanelGenerator', this panel is not created.
1814        # noinspection PyBroadException
1815        try:
1816            if 'WindowPanelGenerator' not in o:
1817                return
1818        except:
1819            return
1820
1821        layout = self.layout
1822        if bpy.context.mode == 'EDIT_MESH':
1823            layout.label(text='Warning: Operator does not work in edit mode.', icon='ERROR')
1824        else:
1825            myobject = o.WindowPanelGenerator[0]
1826            layout.prop(myobject, 'prs')
1827            box = layout.box()
1828            box.prop(myobject, 'gen')
1829            box.prop(myobject, 'yuk')
1830            box.prop(myobject, 'kl1')
1831            box.prop(myobject, 'kl2')
1832            box.prop(myobject, 'fk')
1833            box.prop(myobject, 'r')  # rotation
1834
1835            box.prop(myobject, 'mr')
1836            if myobject.mr is True:
1837                row = box.row()
1838                row.prop(myobject, 'mr1')
1839                row.prop(myobject, 'mr2')
1840                row = box.row()
1841                row.prop(myobject, 'mr3')
1842                row.prop(myobject, 'mr4')
1843            row = layout.row()
1844            row.label(text='Frame')
1845            row.label(text='Inner Frame')
1846            row = layout.row()
1847            row.prop(myobject, 'mt1')
1848            row.prop(myobject, 'mt2')
1849
1850            box.prop(myobject, 'UST')
1851            if myobject.UST == '2':
1852                row = box.row()
1853                row.prop(myobject, 'DT2')
1854                if myobject.DT2 == '1':
1855                    row.prop(myobject, 'VL1')
1856                elif myobject.DT2 == '2':
1857                    row.prop(myobject, 'VL2')
1858                box.prop(myobject, 'res')
1859            elif myobject.UST == '3':
1860                row = box.row()
1861                row.prop(myobject, 'DT3')
1862                if myobject.DT3 == '1':
1863                    row.prop(myobject, 'VL1')
1864                elif myobject.DT3 == '2':
1865                    row.prop(myobject, 'VL3')
1866                elif myobject.DT3 == '3':
1867                    row.prop(myobject, 'VL4')
1868            elif myobject.UST == '4':
1869                row = box.row()
1870                row.prop(myobject, 'DT3')
1871                if myobject.DT3 == '1':
1872                    row.prop(myobject, 'VL1')
1873                elif myobject.DT3 == '2':
1874                    row.prop(myobject, 'VL3')
1875                elif myobject.DT3 == '3':
1876                    row.prop(myobject, 'VL4')
1877            row = layout.row()
1878            for i in range(0, myobject.gen):
1879                row.prop(myobject, 'gnx' + str(i))
1880            for j in range(0, myobject.yuk):
1881                row = layout.row()
1882                row.prop(myobject, 'gny' + str(myobject.yuk - j - 1))
1883                for i in range(0, myobject.gen):
1884                    row.prop(myobject, 'k' + str(myobject.yuk - j - 1) + str(i))
1885