-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcreateRectangularMatrix.py
More file actions
95 lines (71 loc) · 3.43 KB
/
createRectangularMatrix.py
File metadata and controls
95 lines (71 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import rhinoscriptsyntax as rs
from random import *
import pprint
'''
# Creates a rectangular matrix given an object or set of objects around a point, which serves as the lower corner
# Given a percentage, randomly creates rectangular matrix. Replications, Spacing, Rotation, Deformation all changed
#
# Copyright 2019 Houtan Bastani
'''
def createRectangularMatrix():
print("\n createRectangularMatrix commands \n")
obj_ids = rs.GetObjects("Select object(s) from which to create the rectangular matrix", 0, True, True)
if obj_ids is None: return
box = rs.BoundingBox(obj_ids)
if not isinstance(box, list): return
origin = rs.PointDivide(rs.PointAdd(box[0], box[6]), 2)
nXdups = rs.GetInteger("Duplications X", 1, 1)
rXdups = rs.GetReal("Duplications X rand", 0, 0, 100) / 100
nYdups = rs.GetInteger("Duplications Y", 1, 1)
rYdups = rs.GetReal("Duplications Y rand", 0, 0, 100) / 100
nZdups = rs.GetInteger("Duplications Z", 1, 1)
rZdups = rs.GetReal("Duplications Z rand", 0, 0, 10) / 100
nXspace = rs.GetReal("Spacing X", 1, 0)
rXspace = rs.GetReal("Spacing X rand", 0, 0, 100)
nYspace = rs.GetReal("Spacing Y", 1, 0)
rYspace = rs.GetReal("Spacing Y rand", 0, 0, 100)
nZspace = rs.GetReal("Spacing Z", 1, 0)
rZspace = rs.GetReal("Spacing Z rand", 0, 0, 100)
nXscale = rs.GetReal("Scale X", 1, 0)
rXscale = rs.GetReal("Scale X rand", 0, 0, 100)
nYscale = rs.GetReal("Scale Y", 1, 0)
rYscale = rs.GetReal("Scale Y rand", 0, 0, 100)
nZscale = rs.GetReal("Scale Z", 1, 0)
rZscale = rs.GetReal("Scale Z rand", 0, 0, 100)
nXrotate = rs.GetReal("Rotate X", 0, 0)
rXrotate = rs.GetReal("Rotate X rand", 0, 0, 100)
nYrotate = rs.GetReal("Rotate Y", 0, 0)
rYrotate = rs.GetReal("Rotate Y rand", 0, 0, 100)
nZrotate = rs.GetReal("Rotate Z", 0, 0)
rZrotate = rs.GetReal("Rotate Z rand", 0, 0, 100)
endpt = rs.GetPoint("To point")
calc_val_real = lambda val, rand: val + uniform(-rand*val, rand*val)
calc_val_int = lambda val, rand: val + int(round(uniform(-rand*val, rand*val)))
xdups = calc_val_int(nXdups, rXdups)
ydups = calc_val_int(nYdups, rYdups)
zdups = calc_val_int(nZdups, rZdups)
xspace = calc_val_real(nXspace, rXspace)
yspace = calc_val_real(nYspace, rYspace)
zspace = calc_val_real(nZspace, rZspace)
xscale = calc_val_real(nXscale, rXscale)
yscale = calc_val_real(nYscale, rYscale)
zscale = calc_val_real(nZscale, rZscale)
xrotate = calc_val_real(nXrotate, rXrotate)
yrotate = calc_val_real(nYrotate, rYrotate)
zrotate = calc_val_real(nZrotate, rZrotate)
# Copy Points with Spacing
for k in range(zdups):
for j in range(ydups):
for i in range(xdups):
newpt = [origin[0] + i * xspace, origin[1] + j * yspace, origin[2] + k * zspace]
translation1 = rs.VectorCreate(endpt, newpt)
# translation2 = rs.VectorCreate(translation1, origin)
copied_obj_ids = rs.CopyObjects(obj_ids, translation1)
for obj in copied_obj_ids:
rs.ScaleObject(obj, newpt, [xscale, yscale, zscale])
plane = rs.ViewCPlane()
rs.RotateObject(obj, newpt, xrotate, plane.XAxis)
rs.RotateObject(obj, newpt, yrotate, plane.YAxis)
rs.RotateObject(obj, newpt, zrotate, plane.ZAxis)
if( __name__ == "__main__" ):
createRectangularMatrix()