Select and delete some poligons of object



  • On 13/11/2017 at 23:15, xxxxxxxx wrote:

    Hi!

    I have some thousands of cubes with a fillet subdivision of 3 so they contain 113 poligons each.

    I thought it would be a good idea to remove the 107 poligons for the fillet and keep the 6 sides only for previewing purposes, because these thousands of cubes can make the viewport animation preview pretty damn slow.

    Thanks to gr4ph0s' help I have a function which goes trough all the 113 polygons and applies a material to the poligons on the cube sides (I found out that the 3rd one is the front, 31st is right, etc - I made a dict of them) but how could I delete the remaining ones, if the SceneQuality is set to Draft?

    I tried this:

    def create_poly_selection(obj) :
        poly_count = obj.GetPolygonCount()
        tags = list()
        for i in xrange(poly_count) :
            CubeSideNumbers = {"3": "FRONT", "31": "RIGHT", "59": "BACK", "87": "LEFT", "112": "TOP", "113": "BOTTOM"}
            if str(i) in CubeSideNumbers:
                tag = c4d.SelectionTag(c4d.Tpolygonselection)
                tag.SetName(str(i))        
                obj.InsertTag(tag)
                tags.append([i, tag])
    **        else:**
    **            if SceneQuality == "Draft":**
    **                obj.remove()**
        return tags

    I got an error for the bold part: AttributeError: 'c4d.PolygonObject' object has no attribute 'remove'

    (I think it's because the "obj" is the cube itself, not the poligon)



  • On 14/11/2017 at 09:46, xxxxxxxx wrote:

    Here an example that should work for you.

    import c4d
      
    def main() :
        dictPolyId = {"2": "FRONT", "5": "RIGHT"}
        
        # Get current obj selected
        obj = op
        if not op: return
        
        # Get poly id to deleted
        polyIdToDelete = list()
        for i in range(0, obj.GetPolygonCount()) :
            if i not in dictPolyId:
                polyIdToDelete.append(i)
                
      
        select = obj.GetPolygonS() #Get the current selection
        
        # Select all poly and deselect only interested poly
        select.SelectAll( obj.GetPolygonCount())
        for polyID in dictPolyId:
            select.Deselect(int(polyID))
      
        # Delete selected polygon
        c4d.utils.SendModelingCommand(c4d.MCOMMAND_DELETE,
                                    list = [obj],
                                    mode = c4d.MODELINGCOMMANDMODE_POLYGONSELECTION,
                                    bc = c4d.BaseContainer(),
                                    doc = obj.GetDocument())
        
        # Optimize in order to remove point
        options = c4d.BaseContainer()
        options[c4d.MDATA_OPTIMIZE_TOLERANCE] = 0.001
        options[c4d.MDATA_OPTIMIZE_POINTS] = True
        options[c4d.MDATA_OPTIMIZE_POLYGONS] = False
        options[c4d.MDATA_OPTIMIZE_UNUSEDPOINTS] = True
        c4d.utils.SendModelingCommand(c4d.MCOMMAND_OPTIMIZE,
                                    list = [obj],
                                    mode = c4d.MODELINGCOMMANDMODE_ALL,
                                    bc = options,
                                    doc = obj.GetDocument())
        
        c4d.EventAdd()
      
    if __name__=='__main__':
        main()
    

    I do not have a lot a time right now, I will explain more in detail later.



  • On 15/11/2017 at 02:29, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    Here an example that should work for you.

    I appreciate your help really much for this and the last one!

    I'm building a programmable dot-matrix display from these six-colored cubes, and it finally begins to work :)



  • On 15/11/2017 at 09:32, xxxxxxxx wrote:

    As gr4phos is showing in his example, the polygons of an object are not objects  themselves, it's rather the other way round, there is a polygon object which contains arrays of points and polygons. So you will rather delete certain polygons from an object. One way to do so is shown by gr4phos above.

    Edit: Sorry, I forgot to hit reload before answering. So my comment obviously wasn't needed anymore.


Log in to reply