예제 #1
0
def alongLine(objList=None, mode='even', curve='linear', spans=2):
    """    
    Arrange a list of objects evenly along a vector from first to last
    
    :parameters:
        objList(list): objects to layout
        mode(string)
            'even' - evenly distributed along line
            'spaced' - distribute along line as close as possible to current position

    :returns
        list of constraints(list)
    """
    _str_func = 'onLine'
    objList = VALID.mNodeStringList(objList)
    log.info("|{0}| >> ObjList: {1} ".format(_str_func, objList))
    _len = len(objList)
    if _len < 3:
        raise ValueError, "|{0}| >> Need at least 3 objects".format(_str_func)

    _pos_start = POS.get(objList[0])
    _pos_end = POS.get(objList[-1])
    curveBuffer = []
    if curve == 'linear':
        if mode != 'even':
            curveBuffer = mc.curve(d=1, ep=[_pos_start, _pos_end])
    elif curve in ['cubic', 'cubicRebuild']:
        l_pos = [POS.get(o) for o in objList]
        knot_len = len(l_pos) + 3 - 1
        crv1 = mc.curve(d=3,
                        ep=l_pos,
                        k=[i for i in range(0, knot_len)],
                        os=True)
        curveBuffer = [crv1]
        if curve == 'cubicRebuild':
            curveBuffer.append(
                mc.rebuildCurve(crv1,
                                ch=0,
                                rpo=0,
                                rt=0,
                                end=1,
                                kr=0,
                                kcp=0,
                                kep=1,
                                kt=0,
                                s=spans,
                                d=3,
                                tol=0.001)[0])

    elif curve == 'cubicArc':
        _mid = MATH.get_midIndex(_len)
        log.info("|{0}| >> cubicArc | mid: {1} ".format(_str_func, _mid))

        l_pos = [POS.get(o) for o in [objList[0], objList[_mid], objList[-1]]]
        knot_len = len(l_pos) + 3 - 1
        curveBuffer = mc.curve(d=3,
                               ep=l_pos,
                               k=[i for i in range(0, knot_len)],
                               os=True)
    else:
        raise ValueError, "|{0}| >>unknown curve setup: {1}".format(
            _str_func, curve)

    if mode == 'even':
        if curve == 'linear':
            _vec = MATH.get_vector_of_two_points(_pos_start, _pos_end)
            _offsetDist = DIST.get_distance_between_points(
                _pos_start, _pos_end) / (_len - 1)
            _l_pos = [
                DIST.get_pos_by_vec_dist(_pos_start, _vec, (_offsetDist * i))
                for i in range(_len)
            ]
            log.info("|{0}| >> offset: {1} ".format(_str_func, _offsetDist))
            log.info("|{0}| >> l_pos: {1} ".format(_str_func, _l_pos))
            for i, o in enumerate(objList[1:-1]):
                POS.set(o, _l_pos[i + 1])
        else:
            _l_pos = CURVES.getUSplitList(curveBuffer, points=_len, rebuild=1)

        for i, o in enumerate(objList[1:-1]):
            POS.set(o, _l_pos[i + 1])

    elif mode == 'spaced':
        _l_pos = []
        for i, o in enumerate(objList[1:-1]):
            #SNAP.go(o,curveBuffer,pivot= 'closestPoint')
            p = DIST.get_by_dist(o, curveBuffer, resMode='pointOnSurface')
            POS.set(o, p)
            _l_pos.append(p)
    else:
        try:
            raise ValueError, "{0} >> mode not supported: {1}".format(
                sys._getframe().f_code.co_name, mode)
        except:
            raise ValueError, "mode not supported: {0}".format(mode)

    if curveBuffer:
        mc.delete(curveBuffer)
    return _l_pos
예제 #2
0
def get_splitValues(surface=None,
                    values=[],
                    mode='u',
                    knotIndices=[],
                    insertMin=False,
                    insertMax=False,
                    preInset=None,
                    postInset=None,
                    offset=None,
                    curvesCreate=False,
                    curvesConnect=False,
                    connectionPoints=9):
    """
    Function to split a curve up u positionally 
    
    :parameters:
        'curve'(None)  -- Curve to split
        
        
        curvesCreate(bool) - create new curves from the new values
        curvesConnect(bool) - whether to connect the first and last curves
        connectionPoints(int) - how many points of connection to use
    :returns
        list of values(list)
        
    hat tip: http://ewertb.soundlinker.com/mel/mel.074.php
    """
    _str_func = 'get_splitValues'
    log.debug("|{0}| >>  ".format(_str_func) + '-' * 80)
    _shape = SHAPES.get_nonintermediate(surface)
    if mode == 'u':
        l_base = get_dat(_shape, uKnots=True)['uKnots']
        minKnot = ATTR.get(_shape, 'minValueU')
        maxKnot = ATTR.get(_shape, 'maxValueU')
    else:
        l_base = get_dat(_shape, vKnots=True)['vKnots']
        minKnot = ATTR.get(_shape, 'minValueV')
        maxKnot = ATTR.get(_shape, 'maxValueV')

    l_sets = []

    log.debug("|{0}| >>  l_base: {1}".format(_str_func, l_base))

    if knotIndices:
        values = [l_base[v] for v in knotIndices]

    for i, v in enumerate(values):
        log.debug("|{0}| >>  Processing: {1} | {2}".format(_str_func, i, v) +
                  "-" * 40)
        _last = False
        if v == values[-1]:
            log.debug("|{0}| >>  last...".format(_str_func))
            _last = True

        if preInset:
            v += preInset
            log.debug("|{0}| >>  preinset: {1}".format(_str_func, v))

        _l = [v]

        _stop = False
        for knot in l_base:
            if _stop or MATH.is_float_equivalent(knot, v) == v: continue
            log.debug("|{0}| >>  checking knot: {1}".format(_str_func, knot))
            if _last:
                if knot > v:
                    _stop = True
                    _l.append(knot)

            if knot > v or knot < v:
                if _last != True and knot < values[i + 1] and knot > v:
                    _l.append(knot)
            log.debug("|{0}| >>  knot add: {1}".format(_str_func, _l))
            """
            if v == values[-1]:
                if knot < maxKnot:
                    _l.append(knot)
            elif _last != True and knot < values[i+1]:
                _l.append(knot)"""

        if _last and insertMax:
            l_add = []
            for v2 in l_base:
                if v2 > _l[-1]:
                    l_add.append(v2)
            for v2 in l_add:
                _l.append(v2)
            _l.append(maxKnot)

        if _last != True:
            _l.append(values[i + 1])

        if insertMin and i == 0:
            _l.insert(0, minKnot)

        if postInset:
            vPost = _l[-1] + postInset
            if vPost < _l[-2]:
                log.debug("|{0}| >>  alternate postInset".format(_str_func))
                vPost = _l[-2] + postInset

            log.debug("|{0}| >>  postInset: {1} | new: {2}".format(
                _str_func, _l[-1], vPost))
            if len(_l) > 1:
                if vPost > max(_l[:-1]):
                    log.debug(
                        "|{0}| >>  v post creater the max".format(_str_func))
                    _l[-1] = vPost
                else:
                    _l = _l[:-1]
            else:
                _l.append(vPost)
            """
            if _last != True:
                for v2 in _l:
                    if v2 > v:
                        _l.remove(v2)"""

        _l = LISTS.get_noDuplicates(_l)
        _l.sort()

        l_sets.append(_l)
        log.debug("|{0}| >>  result: {1} | {2} | {3}".format(
            _str_func, i, v, _l))

    l_pre = copy.copy(l_sets)
    #pprint.pprint(vars())

    if not curvesCreate:
        return l_sets

    log.debug("|{0}| >>  creating curves...".format(_str_func))

    l_newCurves = []
    d_curves = {}
    l_finalCurves = []

    def getCurve(uValue, l_newCurves):
        _crv = d_curves.get(uValue)
        if _crv: return _crv
        _crv = mc.duplicateCurve("{0}.u[{1}]".format(_shape, uValue),
                                 ch=0,
                                 rn=0,
                                 local=0)[0]
        if offset:
            DIST.offsetShape_byVector(_crv, offset, component='cv')
        d_curves[uValue] = _crv
        log.debug("|{0}| >> created: {1} ...".format(_str_func, _crv))
        l_newCurves.append(_crv)
        return _crv

    for i, uSet in enumerate(l_sets):
        _loftCurves = [getCurve(uValue, l_newCurves) for uValue in uSet]
        """
        if len(uSet)<2:
            l_finalCurves.append(mc.duplicate(_loftCurves[0])[0])
            continue"""

        log.debug("|{0}| >> {1} | u's: {2}".format(_str_func, i, uSet))
        """
                            if i == 0 and str_start:
                                _pair = [str_start,c,l_newCurves[i+1]]
                            else:
                                _pair = [c,l_newCurves[i+1]]"""

        if len(_loftCurves) == 1:
            l_mainCurves = [mc.duplicate(_loftCurves[0])[0]]

        else:
            crvBase = mc.duplicate(_loftCurves[0])[0]
            crvEnd = mc.duplicate(_loftCurves[-1])[0]

            l_mainCurves = [crvBase, crvEnd]

            if curvesConnect:
                log.debug("|{0}| >> {1} | Making connectors".format(
                    _str_func, i))
                d_epPos = {}

                for i, crv in enumerate(_loftCurves):
                    _l = CURVES.getUSplitList(crv,
                                              connectionPoints,
                                              rebuild=True,
                                              rebuildSpans=30)[:-1]
                    for ii, p in enumerate(_l):
                        if not d_epPos.get(ii):
                            d_epPos[ii] = []
                        _l = d_epPos[ii]
                        _l.append(p)

                for k, points in d_epPos.iteritems():
                    log.debug("|{0}| >> {1} | k: {1} | points: {2}".format(
                        _str_func, k, points))
                    try:
                        crv_connect = mc.curve(d=1, ep=points, os=True)

                        #CURVES.create_fromList(posList=points)
                        l_mainCurves.append(crv_connect)
                    except Exception, err:
                        print err

        for crv in l_mainCurves[1:]:
            CORERIG.shapeParent_in_place(l_mainCurves[0], crv, False)

        #ml_shapes.append(cgmMeta.validateObjArg(l_mainCurves[0]))
        l_finalCurves.append(l_mainCurves[0])