You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
10 KiB
Plaintext
432 lines
10 KiB
Plaintext
struct CModelling(
|
|
GetNrstEdg, NxtEdg, IsSameLoop, SelLimELoop, NxtEdgRing, IsSameRing, SelLimERing, VertsInSameLoop, SelVertLoop,
|
|
SelVertRing, IsQuadPoly, SelPolyLoop
|
|
)
|
|
|
|
CryModelling = cmodelling()
|
|
|
|
-------------------------Limited Edge Loop---------------------------
|
|
|
|
CryModelling.GetNrstEdg = fn GetNrstEdg Edg1 Edg2 Target =
|
|
(
|
|
Edg1Vrts = (polyop.getvertsusingedge $ Edg1) as array
|
|
Edg2Vrts = (polyop.getvertsusingedge $ Edg2) as array
|
|
TrgtVrts = (polyop.getvertsusingedge $ Target) as array
|
|
mP1 = (((polyop.getvert $ Edg1Vrts[1]) + (polyop.getvert $ Edg1Vrts[2]))/2)
|
|
mP2 = (((polyop.getvert $ Edg2Vrts[1]) + (polyop.getvert $ Edg2Vrts[2]))/2)
|
|
TmP = (((polyop.getvert $ TrgtVrts[1]) + (polyop.getvert $ TrgtVrts[2]))/2)
|
|
if (distance Tmp mP1) > (distance Tmp mP2) then Edg2 else Edg1
|
|
)
|
|
|
|
CryModelling.NxtEdg = fn NxtEdg edg trg =
|
|
(
|
|
EdgsSel = polyop.getedgeselection $
|
|
Verts = (polyop.getEdgeVerts $ edg) as array
|
|
Tmp = #()
|
|
NEdg = #()
|
|
VEdgs = undefined
|
|
for vert in Verts do
|
|
(
|
|
VEdgs = (((polyop.getedgesUsingVert $ vert) - #{edg}) * EdgsSel) as array
|
|
--print VEdgs
|
|
for x in VEdgs do
|
|
(
|
|
append Tmp x
|
|
)
|
|
)
|
|
--print Tmp.count
|
|
if Tmp.count == 1 then append NEdg Tmp[1]
|
|
else
|
|
(
|
|
append NEdg (CryModelling.GetNrstEdg Tmp[1] Tmp[2] trg)
|
|
)
|
|
NEdg[1]
|
|
)
|
|
|
|
CryModelling.IsSameLoop = fn IsSameLoop =
|
|
(
|
|
with undo off
|
|
(
|
|
EdgSel = (polyop.getedgeselection $) as array
|
|
polyop.setEdgeSelection $ EdgSel[1]
|
|
$.buttonOp #selectEdgeLoop
|
|
NSel = polyop.getedgeselection $
|
|
polyop.setEdgeSelection $ EdgSel
|
|
if ((NSel * (EdgSel as bitarray)) as array).count != 2 then false else true
|
|
)
|
|
)
|
|
|
|
CryModelling.SelLimELoop = fn SelLimELoop =
|
|
(
|
|
try
|
|
(
|
|
EdgeSel = (polyop.getEdgeSelection $) as array
|
|
if CryModelling.IsSameLoop() == true then
|
|
(
|
|
with undo on
|
|
(
|
|
with redraw off
|
|
(
|
|
TargEdg = EdgeSel[2]
|
|
SEdg = EdgeSel[1]
|
|
NEdg = EdgeSel[1]
|
|
FinalSel = #(EdgeSel[1], EdgeSel[2])
|
|
$.buttonOp #selectEdgeLoop
|
|
while NEdg != EdgeSel[2] do
|
|
(
|
|
Edg = CryModelling.NxtEdg NEdg TargEdg
|
|
append FinalSel Edg
|
|
NEdg = Edg
|
|
)
|
|
)
|
|
)
|
|
polyop.setEdgeSelection $ FinalSel
|
|
)
|
|
else
|
|
(
|
|
$.buttonOp #selectEdgeLoop
|
|
)
|
|
)
|
|
catch (print "The tool works only on EditablePoly Objects.")
|
|
)
|
|
|
|
-------------------------Limited Edge Ring---------------------------
|
|
|
|
CryModelling.NxtEdgRing = fn NxtEdgRing edg trg =
|
|
(
|
|
EdgsSel = polyop.getedgeselection $
|
|
Verts = polyop.getEdgeVerts $ edg
|
|
Edg1 = polyop.getedgesusingvert $ Verts[1]
|
|
Edg2 = polyop.getedgesusingvert $ Verts[2]
|
|
EdgFaces = (polyop.getEdgeFaces $ edg) as array
|
|
NEdgs = #()
|
|
if EdgFaces.count == 1 then
|
|
(
|
|
Edgs = polyop.getFaceEdges $ EdgFaces[1] as bitarray
|
|
if Edgs.numberset == 4 do
|
|
(
|
|
(((Edgs - Edg1) - Edg2) as array)[1]
|
|
)
|
|
)
|
|
else
|
|
(
|
|
FEdgs1 = (polyop.getFaceEdges $ EdgFaces[1]) as bitarray
|
|
FEdgs2 = (polyop.getFaceEdges $ EdgFaces[2]) as bitarray
|
|
if FEdgs1.numberset == 4 do
|
|
(
|
|
append NEdgs (((FEdgs1 - Edg1) - Edg2) as array)[1]
|
|
)
|
|
if FEdgs2.numberset == 4 do
|
|
(
|
|
append NEdgs (((FEdgs2 - Edg1) - Edg2) as array)[1]
|
|
)
|
|
CryModelling.GetNrstEdg NEdgs[1] NEdgs[2] trg
|
|
)
|
|
)
|
|
|
|
CryModelling.IsSameRing = fn IsSameRing =
|
|
(
|
|
with undo off
|
|
(
|
|
EdgSel = (polyop.getedgeselection $) as array
|
|
polyop.setEdgeSelection $ EdgSel[1]
|
|
$.buttonOp #selectEdgeRing
|
|
NSel = polyop.getedgeselection $
|
|
polyop.setEdgeSelection $ EdgSel
|
|
if ((NSel * (EdgSel as bitarray)) as array).count != 2 then false else true
|
|
)
|
|
)
|
|
|
|
CryModelling.SelLimERing = fn SelLimERing =
|
|
(
|
|
try
|
|
(
|
|
EdgeSel = (polyop.getEdgeSelection $) as array
|
|
if CryModelling.IsSameRing() == true then
|
|
(
|
|
with undo on
|
|
(
|
|
with redraw off
|
|
(
|
|
TargEdg = EdgeSel[2]
|
|
SEdg = EdgeSel[1]
|
|
NEdg = EdgeSel[1]
|
|
FinalSel = #(EdgeSel[1], EdgeSel[2])
|
|
$.buttonOp #selectEdgeRing
|
|
while NEdg != EdgeSel[2] do
|
|
(
|
|
Edg = CryModelling.NxtEdgRing NEdg TargEdg
|
|
append FinalSel Edg
|
|
NEdg = Edg
|
|
)
|
|
)
|
|
)
|
|
polyop.setEdgeSelection $ FinalSel
|
|
)
|
|
else
|
|
(
|
|
$.buttonOp #selectEdgeRing
|
|
)
|
|
)
|
|
catch (print "The tool works only on EditablePoly Objects.")
|
|
)
|
|
|
|
-------------------------Limited Vert Loop----------------------------
|
|
CryModelling.VertsInSameLoop = fn VertsInSameLoop =
|
|
(
|
|
Verts = polyop.GetVertSelection $
|
|
Edgs = #()
|
|
for x in Verts do
|
|
(
|
|
Edges = polyop.GetEdgesUsingVert $ x
|
|
polyop.setEdgeSelection $ Edges
|
|
$.ButtonOp #SelectEdgeLoop
|
|
Tmp = polyop.GetEdgeSelection $
|
|
append Edgs Tmp
|
|
)
|
|
if (Edgs[1]*Edgs[2]).numberset != 0 then true else false
|
|
)
|
|
|
|
CryModelling.SelVertLoop = fn SelVertLoop =
|
|
(
|
|
try
|
|
(
|
|
if CryModelling.VertsInSameLoop() == true then
|
|
(
|
|
with undo on
|
|
(
|
|
with redraw off
|
|
(
|
|
Verts = polyop.GetVertSelection $
|
|
Edgs = #()
|
|
for x in Verts do
|
|
(
|
|
Edges = polyop.GetEdgesUsingVert $ x
|
|
polyop.setEdgeSelection $ Edges
|
|
$.ButtonOp #SelectEdgeLoop
|
|
Tmp = polyop.GetEdgeSelection $
|
|
append Edgs Tmp
|
|
)
|
|
LoopEdgs = Edgs[1]*Edgs[2]
|
|
V1Edges = (polyop.GetEdgesUsingVert $ (Verts as array)[1]) * LoopEdgs
|
|
V2Edges = (polyop.GetEdgesUsingVert $ (Verts as array)[2]) * LoopEdgs
|
|
LoopArr = #()
|
|
for i = 1 to 2 do
|
|
(
|
|
VEdgs = polyop.setEdgeSelection $ #{(V1Edges as array)[i], (V2Edges as array)[i]}
|
|
CryModelling.SelLimELoop()
|
|
append LoopArr (polyop.getEdgeSelection $)
|
|
)
|
|
FEdgs = LoopArr[1]*LoopArr[2]
|
|
FVerts = #{}
|
|
for x in FEdgs do
|
|
(
|
|
FVerts = FVerts + (polyop.GetVertsUsingEdge $ x)
|
|
)
|
|
polyop.setVertSelection $ FVerts
|
|
)
|
|
redrawViews()
|
|
)
|
|
)
|
|
else
|
|
(
|
|
print "Verts are not in the same loop!"
|
|
)
|
|
)
|
|
catch (print "The tool works only on EditablePoly Objects.")
|
|
)
|
|
|
|
-------------------------Limited Vert Ring------------------------------
|
|
CryModelling.SelVertRing = fn SelVertRing =
|
|
(
|
|
try
|
|
(
|
|
with undo on
|
|
(
|
|
with redraw off
|
|
(
|
|
VertSel = polyop.GetVertSelection $
|
|
UserEdgs = polyop.GetEdgeSelection $
|
|
Edgs = #{}
|
|
FEdgs = #{}
|
|
for v in VertSel do
|
|
(
|
|
Vedgs = polyop.GetEdgesUsingVert $ v
|
|
if Edgs.numberset != 0 then
|
|
(
|
|
Inter = Edgs * Vedgs
|
|
if Inter.numberset != 0 then
|
|
(
|
|
FEdgs = FEdgs + Inter
|
|
)
|
|
else
|
|
(
|
|
Edgs = Edgs + Vedgs
|
|
)
|
|
)
|
|
else
|
|
(
|
|
Edgs = Edgs + Vedgs
|
|
)
|
|
)
|
|
polyop.SetEdgeSelection $ FEdgs
|
|
SelLimERing()
|
|
ESel = polyop.GetEdgeSelection $
|
|
FVerts = #{}
|
|
for edg in ESel do
|
|
(
|
|
FVerts = FVerts + (polyop.GetVertsUsingEdge $ edg)
|
|
)
|
|
polyop.setEdgeSelection $ UserEdgs
|
|
polyop.setVertSelection $ FVerts
|
|
)
|
|
redrawviews()
|
|
)
|
|
)
|
|
catch (print "The tool works only on EditablePoly Objects.")
|
|
)
|
|
|
|
-------------------------Limited Poly Loop------------------------------
|
|
CryModelling.IsQuadPoly = fn IsQuadPoly =
|
|
(
|
|
Arr = #()
|
|
for x in $.selectedfaces do
|
|
(
|
|
a = (polyop.getFaceEdges $ x.index) as array
|
|
if a.count == 4 then
|
|
(
|
|
append Arr x
|
|
)
|
|
)
|
|
if Arr.count == $.selectedfaces.count then true else false
|
|
)
|
|
|
|
CryModelling.SelPolyLoop = fn SelPolyLoop =
|
|
(
|
|
try
|
|
(
|
|
if CryModelling.IsQuadPoly() == true then
|
|
(
|
|
EdgeCount = #{}
|
|
for x in $.selectedFaces do
|
|
(
|
|
a = (polyop.GetFaceEdges $ x.index) as array
|
|
for x in a do
|
|
(
|
|
append EdgeCount x
|
|
)
|
|
)
|
|
if (EdgeCount as array).count == ($.selectedFaces.count * 4) then
|
|
(
|
|
if $.selectedFaces.count == 1 then
|
|
(
|
|
with undo on
|
|
(
|
|
with redraw off
|
|
(
|
|
Sel = #{}
|
|
dg = polyop.SetEdgeSelection $ ((polyop.GetFaceEdges $ $.selectedFaces[1].index) as array)
|
|
$.buttonOp #selectEdgeRing
|
|
for x in $.selectedEdges do
|
|
(
|
|
a = (polyop.getEdgeFaces $ x.index) as array
|
|
for x in a do
|
|
(
|
|
if ((polyop.getFaceEdges $ x)as array).count == 4 then
|
|
(
|
|
append Sel x
|
|
)
|
|
)
|
|
)
|
|
polyop.SetFaceSelection $ Sel
|
|
)
|
|
redrawviews()
|
|
)
|
|
)
|
|
else
|
|
(
|
|
with undo on
|
|
(
|
|
with redraw off
|
|
(
|
|
Face1 = $.selectedFaces[1].index
|
|
Face2 = $.selectedFaces[2].index
|
|
Edgs1 = polyop.GetEdgesUsingFace $ Face1
|
|
Edgs2 = polyop.GetEdgesUsingFace $ Face2
|
|
UserSel = polyop.getedgeselection $
|
|
polyop.setEdgeSelection $ Edgs1
|
|
$.ButtonOp #SelectEdgeRing
|
|
NSel = (polyop.GetEdgeSelection $) - Edgs1
|
|
CrosSel = NSel * Edgs2
|
|
if CrosSel.numberset != 0 then
|
|
(
|
|
polyop.setEdgeSelection $ CrosSel
|
|
$.ButtonOp #SelectEdgeRing
|
|
NSel = (polyop.GetEdgeSelection $) - Edgs2
|
|
CrosSel2 = NSel * Edgs1
|
|
FinalEdgs = #{}
|
|
for i = 1 to 2 do
|
|
(
|
|
SelEdg = polyop.setEdgeSelection $ #((CrosSel as array)[i], (CrosSel2 as array)[i])
|
|
CryModelling.SelLimERing ()
|
|
FinalEdgs = FinalEdgs + (polyop.getedgeselection $)
|
|
)
|
|
polyop.setEdgeSelection $ UserSel
|
|
FinalFaces = #{}
|
|
for x in FinalEdgs do
|
|
(
|
|
Faces = polyop.getFacesUsingEdge $ x
|
|
for f in Faces do
|
|
(
|
|
if ((polyop.GetEdgesUsingFace $ f)*FinalEdgs).numberset == 2 then
|
|
(
|
|
append FinalFaces f
|
|
)
|
|
)
|
|
)
|
|
polyop.setFaceSelection $ FinalFaces
|
|
)
|
|
redrawViews()
|
|
)
|
|
)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
if $.selectedFaces.count == 2 then
|
|
(
|
|
with undo on
|
|
(
|
|
with redraw off
|
|
(
|
|
Ar1 = #()
|
|
for x in $.selectedFaces do
|
|
(
|
|
Edg = polyop.getEdgesUsingFace $ x.index
|
|
append Ar1 Edg
|
|
)
|
|
FEdg = (Ar1[1]*Ar1[2])
|
|
polyop.setedgeselection $ FEdg
|
|
$.buttonOp #selectEdgeRing
|
|
Sel = #{}
|
|
for x in $.selectededges do
|
|
(
|
|
a = (polyop.getEdgeFaces $ x.index) as array
|
|
for x in a do
|
|
(
|
|
if ((polyop.getFaceEdges $ x)as array).count == 4 then
|
|
(
|
|
append Sel x
|
|
)
|
|
)
|
|
)
|
|
polyop.SetFaceSelection $ Sel
|
|
)
|
|
redrawviews ()
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
catch (print "The tool works only on EditablePoly Objects.")
|
|
) |