C4D测量脚本:Python : Aire et volume 

2014-11-21 19:47 发布 | 作品版权归原作者所有,仅供参考学习,禁止商业使用!

插件脚本 /[测量移动]
609 1 0
C4D测量脚本:Python : Aire et volume
C4D测量脚本:Python : Aire et volume - C4D之家 - image_01.png

Copier le dossier « vonc_airevol » dans le dossier « plugins » du répertoire de Cinéma 4D.
v 1.3 :
- Calcul de multiples objets.
- Mise à jour auto.
- Traduction tchèque par Lubo Bezek.

v 1.2 :
- Corrections mineures.

v 1.1 :
- Possibilité de changer l'unité.
- Prise en compte de l'échelle du document.


Calcule l'aire et le volume :
- d'objets fermés,
- d'objets ouverts,
- de sélections de polygones,
- de tracés (splines).
Fichier .PYP
  1. import os
  2. import c4d
  3. from c4d import gui, plugins, utils, bitmaps, Vector
  4. from c4d.utils import SendModelingCommand, Neighbor
  5. from c4d.plugins import GeLoadString as txt

  6. # César Vonc - code.vonc.fr

  7. MODULE_ID = 1030057
  8. VONC_AIRVOL_NOM = 1000
  9. VONC_AIRVOL_ETAT_0 = 1001
  10. VONC_AIRVOL_ETAT_1 = 1002
  11. VONC_AIRVOL_AIRE = 1003
  12. VONC_AIRVOL_VOLUME = 1004
  13. VONC_AIRVOL_CALCULER = 1005
  14. VONC_AIRVOL_POLSEL = 1006
  15. VONC_AIRVOL_LICENCE = 1007
  16. VONC_AIRVOL_CLEF = 1008
  17. VONC_AIRVOL_INFO = 1009
  18. VONC_AIRVOL_AIDE = 1010
  19. VONC_AIRVOL_OBJSEL = 1011
  20. VONC_AIRVOL_SOUSOBJ = 1012
  21. VONC_AIRVOL_TOTAL = 1013
  22. VONC_AIRVOL_TOTALE = 1014
  23. VONC_AIRVOL_MAJ = 1015
  24. VERSION = "1.3"

  25. class Airevolume() :
  26.         
  27.         def __init__(self, so) :
  28.                 self.objs = None
  29.                 self.sousObj = so
  30.                 self.aire = 0
  31.                 self.volume = 0
  32.                 self.sel = 0
  33.                 self.nbObj = 0
  34.                 self.liObjs = []
  35.                 self.liVol = []
  36.                 self.liAire = []
  37.                
  38.                 self.doc = c4d.documents.GetActiveDocument()
  39.                 self.op = self.doc.GetActiveObject()
  40.                
  41.                 if so :
  42.                         self.objs = self.doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_0)
  43.                 else :
  44.                         self.objs = self.doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
  45.         
  46.         def fermeTrous(self, obj, mat) :
  47.                 obj.SetMg(mat)
  48.                 doc = self.doc
  49.                 doc.InsertObject(obj)
  50.                 polys = obj.GetAllPolygons()
  51.                 n = Neighbor()
  52.                 n.Init(obj)
  53.                 params = c4d.BaseContainer()
  54.                 params[c4d.MDATA_CLOSEHOLE_INDEX] = obj
  55.                 params[c4d.MDATA_CLOSEHOLE_TRI] = True
  56.                 mode = c4d.MODELINGCOMMANDMODE_EDGESELECTION
  57.                 commande = c4d.ID_MODELING_CLOSEHOLE_TOOL
  58.                
  59.                 for i, pol in enumerate(polys):
  60.                         nab = n.GetNeighbor(pol.a, pol.b, i)
  61.                         nbc = n.GetNeighbor(pol.b, pol.c, i)
  62.                         ncd = n.GetNeighbor(pol.c, pol.d, i)
  63.                         nda = n.GetNeighbor(pol.d, pol.a, i)
  64.                         cotes = n.GetPolyInfo(i)["edge"]
  65.                         
  66.                         if nab == -1:
  67.                                 params[c4d.MDATA_CLOSEHOLE_EDGE] = cotes[0]
  68.                                 SendModelingCommand(command=commande, list=[obj], mode=mode, bc=params, doc=doc)
  69.                                 n.Init(obj)
  70.                         if nbc == -1:
  71.                                 params[c4d.MDATA_CLOSEHOLE_EDGE] = cotes[1]
  72.                                 SendModelingCommand(command=commande, list=[obj], mode=mode, bc=params, doc=doc)
  73.                                 n.Init(obj)
  74.                         if ((ncd == -1) and (pol.c != pol.d)):
  75.                                 params[c4d.MDATA_CLOSEHOLE_EDGE] = cotes[2]
  76.                                 SendModelingCommand(command=commande, list=[obj], mode=mode, bc=params, doc=doc)
  77.                                 n.Init(obj)
  78.                         if nda == -1:
  79.                                 params[c4d.MDATA_CLOSEHOLE_EDGE] = cotes[3]
  80.                                 SendModelingCommand(command=commande, list=[obj], mode=mode, bc=params, doc=doc)
  81.                                 n.Init(obj)
  82.                
  83.                 obj.Remove()
  84.                 c4d.EventAdd()
  85.                 return obj

  86.         def volumeTetraedre(self, p1, p2, p3) :
  87.                 return p1.Dot(p2.Cross(p3)) / 6.0

  88.         def aireTriangle(self, A, B, C) :
  89.                 vAB = A - B
  90.                 vAC = A - C
  91.                 return vAB.Cross(vAC).GetLength() * 0.5
  92.         
  93.         def Calcule(self) :
  94.                 self.aire = 0
  95.                 self.volume = 0
  96.                 self.sel = 0
  97.                 tab3 = []
  98.                 for obj in self.objs :
  99.                         conv = SendModelingCommand(command=c4d.MCOMMAND_CURRENTSTATETOOBJECT, list=[obj], doc=self.doc)
  100.                         if not conv : continue
  101.                         conv = conv[0]
  102.                         conv.SetMg(obj.GetMg())
  103.                         cache = conv.GetDeformCache() or conv.GetCache() or conv
  104.                         cache = cache.GetDeformCache() or cache
  105.                         if cache : tab3.append(cache)
  106.                
  107.                 self.objs = tab3
  108.                
  109.                 if self.sousObj :
  110.                         tab = []
  111.                         tab2 = []
  112.                         for obj in self.objs :
  113.                                 tab2.append(obj)
  114.                                 sobj = obj.GetDown()
  115.                                 if sobj : tab.append(sobj)
  116.                         for obj in tab :
  117.                                 while obj :
  118.                                         objs = [obj]
  119.                                         for o in objs :
  120.                                                 tab2.append(o)
  121.                                                 objs.extend(o.GetChildren())
  122.                                         obj = obj.GetNext()
  123.                         
  124.                         self.objs = tab2
  125.                
  126.                 for obj in self.objs :
  127.                         aire, volume = self.CalculeObj(obj)
  128.                         self.aire += aire
  129.                         self.volume += volume
  130.                         if aire or volume :
  131.                                 self.liObjs.append(obj.GetName())
  132.                                 self.liAire.append(aire)
  133.                                 self.liVol.append(volume)
  134.                
  135.                 # self.nbObj = len(self.objs)
  136.                 self.nbObj = len(self.liObjs)
  137.                
  138.                
  139.         def CalculeObj(self, obj):
  140.                 if not obj : return 0, 0
  141.                 doc = self.doc
  142.                
  143.                 # Si cerce
  144.                 if obj.CheckType(c4d.Ospline) :
  145.                         peau = c4d.BaseObject(c4d.Oloft)
  146.                         obj.GetClone().InsertUnder(peau)
  147.                         retour = SendModelingCommand(command=c4d.MCOMMAND_CURRENTSTATETOOBJECT, list=[peau], doc=doc)
  148.                         if not retour : return 0, 0
  149.                         if retour[0].CheckType(c4d.Opolygon) : obj = retour[0]
  150.                         else : obj = retour[0].GetDown()
  151.                         if not obj : return 0, 0
  152.                
  153.                 if not obj.CheckType(c4d.Opolygon) :
  154.                         return 0, 0
  155.                
  156.                 # Détache la sélection
  157.                 if obj.GetBit(c4d.BIT_ACTIVE) :
  158.                         if doc.GetMode() == c4d.Mpolygons :
  159.                                 bs = obj.GetPolygonS()
  160.                                 self.sel += bs.GetCount()
  161.                                 retour = SendModelingCommand(command=c4d.MCOMMAND_SPLIT, list=[obj],
  162.                                                         mode=c4d.MODELINGCOMMANDMODE_POLYGONSELECTION, doc=doc)
  163.                                 if not retour : return 0, 0
  164.                                 obj = retour[0]
  165.                
  166.                 # Optimise
  167.                 params = c4d.BaseContainer()
  168.                 params[c4d.MDATA_OPTIMIZE_TOLERANCE] = 0.001
  169.                 params[c4d.MDATA_OPTIMIZE_POINTS] = False
  170.                 params[c4d.MDATA_OPTIMIZE_POLYGONS] = True
  171.                 params[c4d.MDATA_OPTIMIZE_UNUSEDPOINTS] = True
  172.                 SendModelingCommand(command=c4d.MCOMMAND_OPTIMIZE, list=[obj], bc=params, doc=doc)
  173.                
  174.                 # Ferme les trous
  175.                 objVol = self.fermeTrous(obj.GetClone(), obj.GetMg())
  176.                
  177.                 # Aligne les normales
  178.                 SendModelingCommand(command=c4d.MCOMMAND_ALIGNNORMALS, list=[obj], doc=doc)
  179.                 SendModelingCommand(command=c4d.MCOMMAND_ALIGNNORMALS, list=[objVol], doc=doc)
  180.                
  181.                 # Triangule
  182.                 SendModelingCommand(command=c4d.MCOMMAND_TRIANGULATE, list=[obj], doc=doc)
  183.                 SendModelingCommand(command=c4d.MCOMMAND_TRIANGULATE, list=[objVol], doc=doc)
  184.                
  185.                 # --
  186.                
  187.                 polys = obj.GetAllPolygons()
  188.                 pts = obj.GetAllPoints()
  189.                 polysVol = objVol.GetAllPolygons()
  190.                 ptsVol = objVol.GetAllPoints()
  191.                
  192.                 ech = Vector(obj.GetMg().v1.GetLength(), obj.GetMg().v2.GetLength(), obj.GetMg().v3.GetLength())
  193.                 pts = [pt.__rxor__(ech) for pt in pts]
  194.                 ech = Vector(objVol.GetMg().v1.GetLength(), objVol.GetMg().v2.GetLength(), objVol.GetMg().v3.GetLength())
  195.                 # ech = objVol.GetAbsScale()
  196.                 ptsVol = [pt.__rxor__(ech) for pt in ptsVol]
  197.                
  198.                 aire = 0.0
  199.                 for pol in polys :
  200.                         aire += self.aireTriangle(pts[pol.a], pts[pol.b], pts[pol.c])
  201.                
  202.                 volume = 0.0
  203.                 for pol in polysVol :
  204.                         volume += self.volumeTetraedre(ptsVol[pol.a], ptsVol[pol.b], ptsVol[pol.c])
  205.                
  206.                 volume = abs(volume)
  207.                 return aire, volume
  208.         
  209. class Dialogue(gui.GeDialog):
  210.         
  211.         def __init__(self) :
  212.                 self.airevol = None
  213.                 self.uniteFin = 0
  214.                 self.sousObj = True
  215.                 self.majAuto = True
  216.                 self.caches = [[],0,0,0,0]
  217.                 self.airevol = Airevolume(self.sousObj)
  218.                 self.airevol.Calcule()
  219.                
  220.                 prefs = c4d.GetWorldContainer()
  221.                 unitePref = prefs[c4d.WPREF_UNITS_BASIC]
  222.                 self.uniteFin = unitePref
  223.         
  224.         def unite(self, v, valeur) :
  225.                 doc = c4d.documents.GetActiveDocument()
  226.                
  227.                 donneesDoc = doc.GetData()[c4d.DOCUMENT_DOCUNIT]
  228.                 ech, uniteDoc = donneesDoc.GetUnitScale()
  229.                
  230.                 uniteFin = self.uniteFin
  231.                
  232.                 ufin = ""
  233.                 if uniteFin == c4d.UNIT_NONE : ufin = ""
  234.                 elif uniteFin == c4d.UNIT_KM : ufin = "km"
  235.                 elif uniteFin == c4d.UNIT_M : ufin = "m"
  236.                 elif uniteFin == c4d.UNIT_CM : ufin = "cm"
  237.                 elif uniteFin == c4d.UNIT_MM : ufin = "mm"
  238.                 elif uniteFin == c4d.UNIT_UM : ufin = "µm"
  239.                 elif uniteFin == c4d.UNIT_NM : ufin = "nm"
  240.                 elif uniteFin == c4d.UNIT_MILE : ufin = "mi"
  241.                 elif uniteFin == c4d.UNIT_YARD : ufin = "yd"
  242.                 elif uniteFin == c4d.UNIT_FEET : ufin = "ft"
  243.                 elif uniteFin == c4d.UNIT_INCH : ufin = "in"
  244.                
  245.                 valeur *= ech**v
  246.                
  247.                 fac = 1.0
  248.                 if uniteDoc == c4d.UNIT_KM : fac *= 10.0**(3*v)
  249.                 elif uniteDoc == c4d.UNIT_CM : fac *= 10.0**(-2*v)
  250.                 elif uniteDoc == c4d.UNIT_MM : fac *= 10.0**(-3*v)
  251.                 elif uniteDoc == c4d.UNIT_UM : fac *= 10.0**(-6*v)
  252.                 elif uniteDoc == c4d.UNIT_NM : fac *= 10.0**(-9*v)
  253.                 elif uniteDoc == c4d.UNIT_MILE : fac *= 1609.344**v
  254.                 elif uniteDoc == c4d.UNIT_YARD : fac *= 0.9144**v
  255.                 elif uniteDoc == c4d.UNIT_FEET : fac *= 0.3048**v
  256.                 elif uniteDoc == c4d.UNIT_INCH : fac *= 0.0254**v
  257.                
  258.                 if ufin == "km" : fac *= 10.0**(-3*v)
  259.                 elif ufin == "cm" : fac *= 10.0**(2*v)
  260.                 elif ufin == "mm" : fac *= 10.0**(3*v)
  261.                 elif ufin == "µm" : fac *= 10.0**(6*v)
  262.                 elif ufin == "nm" : fac *= 10.0**(9*v)
  263.                 elif ufin == "mi" : fac /= 1609.344**v
  264.                 elif ufin == "yd" : fac /= 0.9144**v
  265.                 elif ufin == "ft" : fac /= 0.3048**v
  266.                 elif ufin == "in" : fac /= 0.0254**v
  267.                
  268.                 valeur *= fac
  269.                
  270.                 if v == 2 : v = "²"
  271.                 elif v == 3 : v = "³"
  272.                 if valeur > 10.0 : valeur = round(valeur, 4)
  273.                 retour = str(valeur) + " " + ufin + v
  274.                 return retour
  275.         
  276.         def rapport(self) :
  277.                 chn = ""
  278.                 chn += txt(VONC_AIRVOL_POLSEL) + " : " + str(self.airevol.sel) + "\r\n"
  279.                 chn += txt(VONC_AIRVOL_OBJSEL) + " : " + str(self.airevol.nbObj) + "\r\n"
  280.                 chn += "\r\n"
  281.                
  282.                 liNb = len(self.airevol.liObjs)
  283.                
  284.                 if liNb > 1 : chn += txt(VONC_AIRVOL_AIRE) + " : " + self.unite(2, self.airevol.aire) + "\r\n"
  285.                 else : chn += txt(VONC_AIRVOL_AIRE) + " : \r\n"
  286.                 for i in xrange(liNb) :
  287.                         chn += "    " + self.airevol.liObjs[i] + " : " + self.unite(2, self.airevol.liAire[i]) + "\r\n"
  288.                 chn += "\r\n"
  289.                
  290.                 if liNb > 1 : chn += txt(VONC_AIRVOL_VOLUME) + " : " + self.unite(3, self.airevol.volume) + "\r\n"
  291.                 else : chn += txt(VONC_AIRVOL_VOLUME) + " : \r\n"
  292.                 for i in xrange(liNb) :
  293.                         if i : chn += "\r\n"
  294.                         chn += "    " + self.airevol.liObjs[i] + " : " + self.unite(3, self.airevol.liVol[i])
  295.                
  296.                 return chn
  297.         
  298.         def opere(self, force=False) :
  299.                 self.sousObj = self.GetBool(23)
  300.                 self.majAuto = self.GetBool(24)
  301.                
  302.                 doc = c4d.documents.GetActiveDocument()
  303.                 if self.sousObj :
  304.                         objs = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_0)
  305.                 else :
  306.                         objs = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
  307.                 caches = [objs, 0, 0, 0, 0]
  308.                 if objs :
  309.                         tabobjs = objs[:]
  310.                         for obj in tabobjs :
  311.                                 caches[1] += obj.GetDirty(c4d.DIRTY_SELECT)
  312.                                 caches[2] += obj.GetDirty(c4d.DIRTY_MATRIX)
  313.                                 caches[3] += obj.GetDirty(c4d.DIRTY_DATA)
  314.                                 caches[4] += obj.GetDirty(c4d.DIRTY_CHILDREN)
  315.                                 tabobjs.extend(obj.GetChildren())
  316.                 if not force :
  317.                         if caches == self.caches :
  318.                                 self.caches = caches
  319.                                 return
  320.                
  321.                 self.caches = caches
  322.                 self.airevol = Airevolume(self.sousObj)
  323.                 self.airevol.Calcule()
  324.                 self.uniteFin = self.GetLong(41)
  325.                 self.SetString(26, self.rapport())
  326.         
  327.         def CreateLayout(self) :
  328.                 self.GroupBegin(40, c4d.BFH_SCALEFIT, 2, 1)
  329.                 self.GroupBorderSpace(5, 0, 5, 0)
  330.                 self.AddButton(21, c4d.BFH_SCALE|c4d.BFH_RIGHT, initw=150, inith=20, name=txt(VONC_AIRVOL_CALCULER))
  331.                 self.AddComboBox(41, c4d.BFH_SCALE|c4d.BFH_CENTER, initw=60)
  332.                 # self.AddChild(41, c4d.UNIT_NONE, "")
  333.                 self.AddChild(41, c4d.UNIT_KM, "km")
  334.                 self.AddChild(41, c4d.UNIT_M, "m")
  335.                 self.AddChild(41, c4d.UNIT_CM, "cm")
  336.                 self.AddChild(41, c4d.UNIT_MM, "mm")
  337.                 self.AddChild(41, c4d.UNIT_UM, "µm")
  338.                 self.AddChild(41, c4d.UNIT_NM, "nm")
  339.                 self.AddChild(41, c4d.UNIT_MILE, "mi")
  340.                 self.AddChild(41, c4d.UNIT_YARD, "yd")
  341.                 self.AddChild(41, c4d.UNIT_FEET, "ft")
  342.                 self.AddChild(41, c4d.UNIT_INCH, "in")
  343.                 self.GroupEnd()
  344.                
  345.                 self.GroupBegin(20, c4d.BFH_SCALEFIT, 1, 1)
  346.                 self.GroupBorderSpace(5, 0, 5, 0)
  347.                 self.AddCheckbox(23, c4d.BFH_SCALEFIT, 0, 0, txt(VONC_AIRVOL_SOUSOBJ))
  348.                 self.AddCheckbox(24, c4d.BFH_SCALEFIT, 0, 0, txt(VONC_AIRVOL_MAJ))
  349.                 self.GroupEnd()
  350.                
  351.                 self.GroupBegin(25, c4d.BFH_SCALEFIT|c4d.BFV_SCALEFIT, 1, 1)
  352.                 self.GroupBorderSpace(5, 0, 5, 0)
  353.                 self.GroupBorderNoTitle(c4d.BORDER_THIN_IN)
  354.                 self.AddMultiLineEditText(26, c4d.BFH_SCALEFIT|c4d.BFV_SCALEFIT)
  355.                 self.GroupEnd()
  356.                
  357.                 self.GroupBegin(30, c4d.BFH_SCALEFIT, 1, 1)
  358.                 self.GroupBorderSpace(5, 5, 5, 5)
  359.                 self.AddStaticText(31, c4d.BFH_SCALEFIT, name="v "+VERSION+" - "+txt(VONC_AIRVOL_INFO))
  360.                 self.GroupEnd()
  361.                 return True
  362.         
  363.         def InitValues(self) :
  364.                 self.SetTitle(txt(VONC_AIRVOL_NOM))
  365.                 self.SetLong(41, self.uniteFin)
  366.                 self.SetBool(23, self.sousObj)
  367.                 self.SetBool(24, self.majAuto)
  368.                 self.SetString(26, self.rapport())
  369.                 return True
  370.         
  371.         def Command(self, id, msg) :
  372.                 if id == 21 or id == 23 or id == 24 :
  373.                         self.opere(True)
  374.                 elif id == 41 :
  375.                         self.uniteFin = self.GetLong(41)
  376.                         self.SetString(26, self.rapport())
  377.                         
  378.                 return True
  379.         
  380.         def CoreMessage(self, id, msg) :
  381.                
  382.                 if self.majAuto and id == c4d.EVMSG_CHANGE :
  383.                         self.opere()
  384.                
  385.                 return True

  386. class AirevolumeCommande(c4d.plugins.CommandData):
  387.         dialog = None
  388.         
  389.         def Execute(self, doc):
  390.                 if self.dialog is None:
  391.                    self.dialog = Dialogue()
  392.                 return self.dialog.Open(dlgtype=c4d.DLG_TYPE_ASYNC, pluginid=MODULE_ID, defaulth=300, defaultw=100)

  393.         def RestoreLayout(self, sec_ref):
  394.                 if self.dialog is None:
  395.                    self.dialog = Dialogue()
  396.                 return self.dialog.Restore(pluginid=MODULE_ID, secret=sec_ref)

  397. if __name__ == "__main__":
  398.          bmp = bitmaps.BaseBitmap()
  399.          dir, f = os.path.split(__file__)
  400.          fn = os.path.join(dir, "res", "vonc_airevol.tif")
  401.          bmp.InitWith(fn)
  402.          c4d.plugins.RegisterCommandPlugin(id=MODULE_ID, str=txt(VONC_AIRVOL_NOM),
  403.                                                                           help=txt(VONC_AIRVOL_AIDE),info=0,
  404.                                                                                 dat=AirevolumeCommande(), icon=bmp)
复制代码

Fichier .H
  1. enum
  2. {
  3.     VONC_AIRVOL_NOM = 1000,
  4.         VONC_AIRVOL_ETAT_0 = 1001,
  5.         VONC_AIRVOL_ETAT_1 = 1002,
  6.         VONC_AIRVOL_AIRE = 1003,
  7.         VONC_AIRVOL_VOLUME = 1004,
  8.         VONC_AIRVOL_CALCULER = 1005,
  9.         VONC_AIRVOL_POLSEL = 1006,
  10.         VONC_AIRVOL_LICENCE = 1007,
  11.         VONC_AIRVOL_CLEF = 1008,
  12.         VONC_AIRVOL_INFO = 1009,
  13.         VONC_AIRVOL_AIDE = 1010,
  14.         VONC_AIRVOL_OBJSEL = 1011,
  15.         VONC_AIRVOL_SOUSOBJ = 1012,
  16.         VONC_AIRVOL_TOTAL = 1013,
  17.         VONC_AIRVOL_TOTALE = 1014,
  18.         VONC_AIRVOL_MAJ = 1015,
  19.         
  20.     _DUMMY_ELEMENT_
  21. };
复制代码

Fichier .STR
  1. STRINGTABLE
  2. {
  3.         VONC_AIRVOL_NOM                 "Aire et Volume";
  4.         VONC_AIRVOL_AIRE                "Aire totale";
  5.         VONC_AIRVOL_VOLUME                "Volume total";
  6.         VONC_AIRVOL_CALCULER        "Calculer";
  7.         VONC_AIRVOL_POLSEL                "Polygones s\u00E9lectionn\u00E9s";
  8.         VONC_AIRVOL_OBJSEL                "Objets";
  9.         VONC_AIRVOL_INFO                "C\u00E9sar Vonc - http://code.vonc.fr";
  10.         VONc_AIRVOL_AIDE                "Calcule l'aire et le volume d'objets, de s\u00E9lections de polygones ou de splines.";
  11.         VONC_AIRVOL_SOUSOBJ                "Inclure les sous-objets";
  12.         VONC_AIRVOL_MAJ                        "Mise \u00E0 jour auto";
  13. }
复制代码
点击下载图标
下载等级
C8D
登录后下载



Comment :1

插件脚本
软件性质:  
适用版本: C4D R15 - C4D R16 - C4D R17 - C4D R18 - C4D R19 - C4D R20 - C4D R21 - C4D S22 - C4D R23 - C4D S24 - C4D R25 - C4D S26 - C4D 2023 - C4D 2024 - C4D 2025
软件版本: Aire et volume v 1.3
系统平台: Win MAC 
软件语言: 英文 
插件来源: https://www.c4d.cn/c4dsoft.html
百套精美Kitbash3D模型专题合集下载
时尚卡通办公室人物C4D立体图标工程下载Cinema 4D Fashion Cartoon Office Character 3D Icon Project Download
C4D科技新闻片头电视栏目频道包装动画工程下载Cinema 4D Technology News Headline TV Program Channel Packaging Animation Project Download
关闭

C4D精选推荐 上一条 /10 下一条

智能
客服
快速回复 返回顶部 返回列表