This repository was archived by the owner on Dec 25, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathquick_stitch.pyp
209 lines (165 loc) · 6.9 KB
/
quick_stitch.pyp
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
"""
Quick Stitch for C4D
Copyright (c) 2020 Nishiki
Released under the MIT license
https://opensource.org/licenses/mit-license.php
"""
import os
import sys
import c4d
import copy
PLUGIN_ID = 1054816
CLONER_OBJECT = 1018544
MOSPLINE_OBJECT = 440000054
def create_spline_from_splinedata(spData, arc, width, height):
if not spData:
return
knots = spData.GetKnots()
cnt = len(knots)
arc.ResizeObject(cnt)
for i in xrange(cnt):
pos = knots[i]["vPos"]
tan_r = knots[i]["vTangentRight"]
tan_l = knots[i]["vTangentLeft"]
pos[0] = (pos[0] - 0.5) * width
pos[1] *= height
tan_r[0] *= width
tan_r[1] *= height
tan_l[0] *= width
tan_l[1] *= height
arc.SetPoint(i, pos)
arc.SetTangent(i, tan_l, tan_r)
arc[c4d.SPLINEOBJECT_ANGLE] = c4d.utils.DegToRad(10)
arc[c4d.ID_BASEOBJECT_REL_ROTATION,c4d.VECTOR_X] = c4d.utils.DegToRad(-90)
arc[c4d.ID_BASEOBJECT_REL_ROTATION,c4d.VECTOR_Y] = c4d.utils.DegToRad(90)
arc[c4d.SPLINEOBJECT_ANGLE] = c4d.utils.DegToRad(15)
def create_spline_from_obj(node, obj):
if (not obj) or (not obj.CheckType(c4d.Opolygon)):
return True
source = obj.GetClone()
selected = source.GetEdgeS()
count = selected.GetCount()
if count < 1:
return True
if c4d.utils.SendModelingCommand(c4d.MCOMMAND_EDGE_TO_SPLINE, [source]):
spl = source.GetDown().GetClone()
spl[c4d.SPLINEOBJECT_INTERPOLATION] = 2 # uniform
copy_coordnates(obj, spl)
child = node.GetDown()
if child and child.CheckType(c4d.Ospline):
child.Remove()
spl.InsertUnder(node)
source.GetDown().Remove()
def copy_coordnates(from_obj, to_obj):
to_obj.SetMg(from_obj.GetMg())
class QuickStitch(c4d.plugins.ObjectData):
def __init__(self, *args):
self.SetOptimizeCache(True)
def Init(self, op):
self.InitAttr(op, int, c4d.QUICK_STITCH_COUNT)
self.InitAttr(op, float, c4d.QUICK_STITCH_WIDTH)
self.InitAttr(op, float, c4d.QUICK_STITCH_HEIGHT)
self.InitAttr(op, float, c4d.QUICK_STITCH_THICKNESS)
self.InitAttr(op, float, c4d.QUICK_STITCH_OFFSET)
self.InitAttr(op, float, c4d.QUICK_STITCH_ROTATION_H)
self.InitAttr(op, float, c4d.QUICK_STITCH_ROTATION_B)
self.InitAttr(op, float, c4d.QUICK_STITCH_ROTATION_P)
op[c4d.QUICK_STITCH_COUNT] = 100
op[c4d.QUICK_STITCH_WIDTH] = 6.0
op[c4d.QUICK_STITCH_HEIGHT] = 3.0
op[c4d.QUICK_STITCH_THICKNESS] = 0.5
op[c4d.QUICK_STITCH_OFFSET] = -1.0
op[c4d.QUICK_STITCH_ROTATION_H] = 0.0
op[c4d.QUICK_STITCH_ROTATION_B] = 0.0
op[c4d.QUICK_STITCH_ROTATION_P] = 0.0
# init spline data
spd = c4d.SplineData()
spd.MakePointBuffer(3)
spd.SetKnot(0, c4d.Vector(0.0, 0.0, 0.0), 65536, vTangentRight=c4d.Vector(0.0, 0.5, 0.0), interpol=0)
spd.SetKnot(1, c4d.Vector(0.5, 1.0, 0.0), 131072, vTangentLeft=c4d.Vector(-0.25, 0.0, 0.0), vTangentRight=c4d.Vector(0.25, 0.0, 0.0), interpol=0)
spd.SetKnot(2, c4d.Vector(1.0, 0.0, 0.0), 196608, vTangentLeft=c4d.Vector(0.0, 0.5, 0.0), interpol=0)
op[c4d.QUICK_STITCH_SHAPE] = spd
# # create
self.spline = None
self.null = c4d.BaseObject(c4d.Onull)
self.cloner = c4d.BaseObject(CLONER_OBJECT)
return True
def set_spline(self, spline):
if not spline.IsAlive():
spline = None
return
self.spline = spline.GetClone()
self.spline.InsertUnder(self.null)
self.cloner[c4d.MG_OBJECT_LINK] = self.spline
def Message(self, node, type, data):
if type == c4d.MSG_DESCRIPTION_COMMAND:
if data["id"][0].id != c4d.QUICK_STITCH_BUTTON:
return True
create_spline_from_obj(node, self.obj)
node.SetDirty(c4d.DIRTYFLAGS_DATA)
return True
def GetVirtualObjects(self, op, hierarchyhelp):
# create
self.obj = op[c4d.QUICK_STITCH_SOURCE]
self.arc = c4d.SplineObject(1, c4d.SPLINETYPE_BEZIER)
self.null = c4d.BaseObject(c4d.Onull)
self.sweep = c4d.BaseObject(c4d.Osweep)
self.sweep.SetPhong(True, True, c4d.utils.DegToRad(50))
self.circle = c4d.BaseObject(c4d.Osplinecircle)
self.cloner = c4d.BaseObject(CLONER_OBJECT)
# insert
self.arc.InsertUnder(self.sweep)
self.circle.InsertUnder(self.sweep)
self.sweep.InsertUnder(self.cloner)
self.cloner.InsertUnder(self.null)
# get obj
self.obj = op[c4d.QUICK_STITCH_SOURCE]
# get spline
if not op.GetDown():
return None
self.spline = op.GetDown()
# property
count = op[c4d.QUICK_STITCH_COUNT]
width = op[c4d.QUICK_STITCH_WIDTH]
height = op[c4d.QUICK_STITCH_HEIGHT]
thickness = op[c4d.QUICK_STITCH_THICKNESS]
offset = op[c4d.QUICK_STITCH_OFFSET]
rotation_h = op[c4d.QUICK_STITCH_ROTATION_H]
rotation_b = op[c4d.QUICK_STITCH_ROTATION_B]
rotation_p = op[c4d.QUICK_STITCH_ROTATION_P]
# circle
self.circle[c4d.PRIM_CIRCLE_RADIUS] = thickness
self.circle[c4d.SPLINEOBJECT_SUB] = 1
# shape
self.shape = op[c4d.QUICK_STITCH_SHAPE]
create_spline_from_splinedata(self.shape, self.arc, width, height)
# cloner setting
self.cloner[c4d.ID_MG_MOTIONGENERATOR_MODE] = 0 # object
self.cloner[c4d.MG_SPLINE_MODE] = 0 # count
self.cloner[c4d.MG_SPLINE_COUNT] = count
self.cloner[c4d.ID_MG_TRANSFORM_POSITION,c4d.VECTOR_X] = -offset
self.cloner[c4d.ID_MG_TRANSFORM_ROTATE,c4d.VECTOR_X] = rotation_h
self.cloner[c4d.ID_MG_TRANSFORM_ROTATE,c4d.VECTOR_Y] = rotation_p
self.cloner[c4d.ID_MG_TRANSFORM_ROTATE,c4d.VECTOR_Z] = rotation_b
self.cloner[c4d.MG_OBJECT_LINK] = self.spline
return self.null
def CopyTo(self, dest, snode, dnode, flags, trn):
if snode.GetDown():
self.spline = snode.GetDown()
if self.spline:
dest.set_spline(self.spline)
return True
if __name__ == "__main__":
directory, _ = os.path.split(__file__)
fn = os.path.join(directory, "res", "qiuckstitch.tif")
bmp = c4d.bitmaps.BaseBitmap()
if bmp is None:
raise MemoryError("Failed to create a BaseBitmap.")
if bmp.InitWith(fn)[0] != c4d.IMAGERESULT_OK:
raise MemoryError("Failed to initialize the BaseBitmap.")
c4d.plugins.RegisterObjectPlugin(id=PLUGIN_ID,
str="QuickStitch",
g=QuickStitch,
description="quick_stitch",
icon=bmp,
info=c4d.OBJECT_GENERATOR)