`
schi
  • 浏览: 205251 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Helix2Cmd

阅读更多

不知道大家还记不记得之前的helixCmd,这个helix2Cmd是从C++转成python的版本,与helixCmd不同的是它不是创建曲线,而是更改曲线,使给定的曲线变成helix曲线,并且支持返回和重做。

 

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""
 This example takes a curve and changes it into a helix.
"""

import sys
import math
import maya.OpenMaya as om
import maya.OpenMayaMPx as ompx

kPluginCmdName = 'spHelix2'

kPitchFlag = "-p"
kPitchLongFlag = "-pitch"
kRadiusFlag = "-r"
kRadiusLongFlag = "-radius"

# command
class Helix2(ompx.MPxCommand):
    def __init__(self):
        super(Helix2, self).__init__()
        
        self.__fDagPath = om.MDagPath()
        self.__fComponent = om.MObject()
        self.__fCVs = om.MPointArray()
        self.__radius = 4.0
        self.__pitch = 0.5
        
    def doIt(self, args):
        """
        doIt用来完成所有的准备工作,最后才执行实际工作.
        """
        argData = om.MArgDatabase(self.syntax(), args)
        if argData.isFlagSet(kPitchFlag):
            self.__pitch = argData.flagArgumentDouble(kPitchFlag, 0)
        if argData.isFlagSet(kRadiusFlag):
            self.__radius = argData.flagArgumentDouble(kRadiusFlag, 0)
        
        # Get the first selected curve from the selection list.
        # 获取所选的nurbsCurve曲线
        slist = om.MSelectionList()
        om.MGlobal.getActiveSelectionList(slist)
        
        mitList = om.MItSelectionList(slist, om.MFn.kNurbsCurve)
        
        # 如果所选物体不是nurbsCurve曲线,引发错误
        if mitList.isDone():
            sys.stderr.write('doIt: no curve has been selected\n')
            raise
        
        mitList.getDagPath(self.__fDagPath, self.__fComponent)
        
        return self.redoIt()
    
    def redoIt(self):
        """
        redoIt来完成实际的工作
        """
        curveFn = om.MFnNurbsCurve(self.__fDagPath)
        
        # 获取曲线的cv数
        numCVs = curveFn.numCVs()
        # 获取所有cv点的坐标
        curveFn.getCVs(self.__fCVs)
        
        # 定义新的cv点的坐标
        points = om.MPointArray(self.__fCVs)
        for i in range(numCVs):
            # Maya python API不支持列表直接赋值,需要使用set()
            #points[i] = om.MPoint(self.__radius * math.cos(i),
                                  #self.__pitch * i, 
                                  #self.__radius * math.sin(i))
            points.set(om.MPoint(self.__radius * math.cos(i),
                                 self.__pitch * i,
                                 self.__radius * math.sin(i)), i)
            
        # 将新的cv点坐标,赋予曲线
        curveFn.setCVs(points)
        # 更新曲线
        curveFn.updateCurve()
        
        return om.MStatus.kSuccess
    
    def undoIt(self):
        """
        undoIt用来还原nurbsCurve曲线
        """
        curveFn = om.MFnNurbsCurve(self.__fDagPath)
        curveFn.setCVs(self.__fCVs)
        curveFn.updateCurve()
        
        self.__fCVs.clear()
        return om.MStatus.kSuccess
    
    def isUndoable(self):
        return True
    
def cmdCreator():
    return ompx.asMPxPtr(Helix2())

def syntaxCreator():
    syntax = om.MSyntax()
    syntax.addFlag(kPitchFlag, kPitchLongFlag, om.MSyntax.kDouble)
    syntax.addFlag(kRadiusFlag, kRadiusLongFlag, om.MSyntax.kDouble)
    return syntax

def initializePlugin(mobject):
    mplugin = ompx.MFnPlugin(mobject, 'Mack Stone', '1.0', 'Any')
    try:
        mplugin.registerCommand(kPluginCmdName, cmdCreator, syntaxCreator)
    except:
        sys.stderr.write('Failed to register command: %s\n' % kPluginCmdName)
        raise
    
def uninitializePlugin(mobject):
    mplugin = ompx.MFnPlugin(mobject)
    try:
        mplugin.deregisterCommand(kPluginCmdName)
    except:
        sys.stderr.write('Failed to unregister comman: %s\n' % kPluginCmdName)
        raise

 使用方法:

在插件面板加载helix2cmd.py,创建或选择一条曲线,执行命令

import maya.cmds as cmds

cmds.spHelix2()
# 或
cmds.spHelix2(r=3.0, p=2.0)

 或

spHelix2;
// 或
spHelix2 -r 5.0 -p 2.0;

 但需要注意的是如果你输入的参数不是浮点值,如输入3,而不是3.0,可能会导致该参数失效而使用上一次的参数,不知道为什么,可能是maya python API对数据的转换还不够健全,或是数据类型十分敏感。

 

你可以在maya安装目录下的devkit/plug-ins找到helix2Cmd.cpp


在线版

http://download.autodesk.com/us/maya/2011help/API/helix2_cmd_8cpp-example.html

 

最后是pymel的版本,再次感受到pymel的强大

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import math
from pymel.core import *

def helix2(r=4, p=0.5):
    # 获取所选物体
    objs = ls(sl=1, long=1)
    if not objs:
        return False
    
    # 获取物体的shape
    shape = objs[0].getChildren()[0]
    # 如果所选物体不是nurbsCurve曲线,引发错误
    if not isinstance(shape, nodetypes.NurbsCurve):
        raise Exception('No curve has been selected or must select nurbsCurve first.')
    
    # 获取曲线的cv数
    numCVs = shape.numCVs()
    # 获取所有cv点的坐标
    CVs = shape.getCVs()
    # 定义新的cv点的坐标
    newCVs = CVs
    for i in range(numCVs):
        newCVs[i] = dt.Point(r * math.cos(i),
                             p * i,
                             r * math.sin(i))
        
    # 将新的cv点坐标,赋予曲线
    shape.setCVs(newCVs)
    # 更新曲线
    shape.updateCurve()
    
    return "Curve %s is turn to helix" % objs[0]

 希望对你们有帮助

0
0
分享到:
评论

相关推荐

    tininkpad helix2 bios编程器备份

    联想thinkpad helix2 平板电脑 bios编程器直接读取芯片备份固件

    helixtoolkit.zip

    2. **3D模型的插入**:在WPF中,3D模型通常以`Model3D`对象的形式存在,可以被插入到3D场景的`Model3DGroup`中。HelixToolkit提供便捷的方法来添加和管理这些3D模型,确保它们在视图中正确显示。 3. **3D模型的旋转...

    Helix Moile Server+Helix producer做直播

    2. 下载并运行 Helix Server 的安装程序。安装过程中,你需要指定授权文件的位置。 3. 阅读并接受许可协议,然后选择合适的安装路径。默认情况下,服务器会将流媒体文件存储在安装目录下,但建议安装完成后更改此...

    HelixToolkit中文开发文档

    HelixToolkit是一个开源的3D图形工具库,专为WPF应用程序设计,其提供了一系列用于3D建模和渲染的组件。HelixToolkit.WPF1.Adorners是一组用于在HelixToolkit渲染环境中增加装饰性的组件,它们可以增强用户的交互...

    WPF 3D工厂 HelixToolkit

    **WPF 3D工厂 HelixToolkit:深入理解与实践** 在Windows Presentation Foundation(WPF)平台上,构建3D图形应用程序是一项技术性极强的工作。Helix Toolkit是为WPF设计的一个开源库,它提供了丰富的3D图形组件和...

    WPF21个优秀项目及源码 helixtoolkit-8c0d58aa0295

    WPF21个优秀项目及源码 helixtoolkit-8c0d58aa0295WPF21个优秀项目及源码 helixtoolkit-8c0d58aa0295WPF21个优秀项目及源码 helixtoolkit-8c0d58aa0295WPF21个优秀项目及源码 helixtoolkit-8c0d58aa0295WPF21个优秀...

    WPF类库Helix Toolkit中文帮助文档

    Helix Toolkit是一个用于在WPF(Windows Presentation Foundation)应用程序中创建和显示3D图形的开源工具库。但官方提供文档过于简单,故整理一下文档供用户参考。该工具库提供了一系列用于处理3D图形的控件、工具...

    stm32 libmad helix MP3软解移植

    2. **选择解码模块**:在Helix框架中,仅使用MP3解码相关的部分,避免引入不必要的模块。 3. **定制构建系统**:可能需要修改构建脚本,使其适应STM32的编译环境。 4. **处理依赖**:Helix可能有额外的库依赖,需要...

    helix server 破解版

    helix server 9 破解版 流媒体视频服务器

    helix移植到microchip单片机

    Helix MP3 解码器是一种开源的音频解码库,支持 MPEG-1、MPEG-2 和 MPEG-2.5 Layer 3(即 MP3)的音频格式。由于其支持多种位速率、可变位速率(VBR)和可选音频采样率等特点,被广泛应用于各种消费电子设备和数字...

    静态分析工具Helix QAC工具+使用指南+配置教程

    2. **导入源代码**:将要分析的源代码添加到项目中,Helix QAC会自动扫描并构建代码依赖关系图。 3. **选择规则集**:从内置的规则库中选择或创建自定义规则集,这些规则将用于检查代码。 4. **配置分析参数**:根据...

    Helix QAC用户使用手册_Windows.pdf

    ### Helix QAC 用户使用手册(Windows)关键知识点解析 #### 一、Helix QAC 简介 Helix QAC 是一款专为软件开发过程中进行静态代码分析而设计的强大工具,它能够帮助开发者在编码阶段即发现并修复潜在的质量问题及...

    WPF利用HelixToolkit后台导入3D模型

    2. **创建3D视图**:在XAML布局文件中,添加一个`HelixViewport3D`控件,这将作为3D场景的容器。 ```xml <helix:HelixViewport3D x:Name="viewport" /> ``` 3. **后台导入模型**:在C#代码中,使用`Task.Run`...

    helix.server.12破解

    Helix.Server.12的破解文件,无限制

    HelixToolkit.WPF文档

    ### HelixToolkit.WPF知识点详解 #### 一、Adorners(装饰器) ##### 1.1 RectangleAdorner **定义**: 这是一种特殊的装饰器,用于在用户进行矩形缩放操作时,在矩形中心显示十字准线,帮助用户更准确地控制缩放...

    linux流媒体搭建HelixServer

    2. 配置文件:`vi /usr/local/helix/etc/helix-server.conf` 在配置文件中,你需要设置服务器监听的IP地址和端口,以及数据存储路径等参数。 示例配置: ``` server-name = "My Helix Server" server-port = ...

    Helix Server 安裝及配置文件

    2. 配置服务器属性:打开Helix Administrator工具,通常位于安装目录下。登录到服务器,首次使用默认的管理员用户名和密码(admin/admin)。 3. 设置端口:在服务器属性中,确认HTTP、RTSP等端口设置正确,避免与...

Global site tag (gtag.js) - Google Analytics