首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python (COIN3D)箭头绘制不旋转(FreeCAD - pivy.coin )

Python (COIN3D)箭头绘制不旋转(FreeCAD - pivy.coin )
EN

Stack Overflow用户
提问于 2021-06-28 02:11:03
回答 1查看 42关注 0票数 0

在我看来,下面的代码是正确的。但不幸的是我不能旋转箭头。无论我从什么角度给这个函数,它都不起作用。我不知道这段代码出了什么问题。

注意:这是我为FreeCAD构建的COIN3D小部件系统的一部分。你可以在我的github = https://github.com/MariwanJ/Design456/tree/devbranch上找到整个项目

代码语言:javascript
复制
#draw an arrow 
def draw_arrow(_Points=[], _color=(0,1,0), _ArrSize=1.0,_rotation=(1.0,1.0,1.0,0.0) ):
    print("point,arrsize,rota",_Points,_ArrSize,_rotation)
    if len (_Points)!=2:
        raise ValueError('must be 2 points')
    try:
        so_separatorRoot=coin.SoSeparator()
        so_separatorHead = coin.SoSeparator()
        so_separatorTail = coin.SoSeparator()
        
        transHead = coin.SoTranslation()   # decide at which position the object will be placed
        transTail = coin.SoTranslation()   # decide at which position the object will be placed
        transRoot= coin.SoTranslation()    # decide at which position the whole objects will be placed
        
        coordsRoot = coin.SoTransform()
        
        cone=coin.SoCone()
        cone.bottomRadius= 3
        cone.height= 3
        
        cylinder=coin.SoCylinder()
        cylinder.height = 10
        cylinder.radius = 0.5
        p1=_Points[0]
        p2=App.Vector(p1.x,p1.y-5,p1.z)

        styleHead = coin.SoDrawStyle()
        styleTail = coin.SoDrawStyle()
        
        styleHead.style = coin.SoDrawStyle.LINES     #draw only frame not filled
        styleHead.lineWidth = 3

        styleTail.style = coin.SoDrawStyle.LINES     #draw only frame not filled
        styleTail.lineWidth = 2
        
        coordsRoot.scaleFactor.setValue([_ArrSize,_ArrSize,_ArrSize])
        coordsRoot.translation.setValue(App.Vector(0,0,0))
        coordsRoot.rotation.Q=_rotation #  SbRotation (const SbVec3f &axis, const float radians)

        transHead.translation.setValue(p1)
        transTail.translation.setValue(p2)
        transRoot.translation.setValue(App.Vector(0.0,0.0,0.0))
        
        color=coin.SoBaseColor(); 
        color.rgb=_color
        
        so_separatorHead.addChild(color)
        so_separatorTail.addChild(color)
        
        so_separatorHead.addChild(transHead)
        so_separatorTail.addChild(transTail)

        so_separatorHead.addChild(styleHead)
        so_separatorHead.addChild(cone)
        
        so_separatorTail.addChild(styleTail)
        so_separatorTail.addChild(cylinder)
        
        so_separatorRoot.addChild(transRoot)
        so_separatorRoot.addChild(color)
        so_separatorRoot.addChild(coordsRoot)
        so_separatorRoot.addChild(so_separatorHead)
        so_separatorRoot.addChild(so_separatorTail)
        
        return so_separatorRoot

    except Exception as err:
        App.Console.PrintError("'Design456_DirectScale' Failed. "
                               "{err}\n".format(err=str(err)))
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        print(exc_type, fname, exc_tb.tb_lineno)
EN

回答 1

Stack Overflow用户

发布于 2021-06-28 22:30:27

我找到了解决方案。事实上,我已经在问题中找到了答案。看看这一行:coordsRoot.rotation.Q=_rotation # SbRotation (const SbVec3f &axis, const float radians)

这里提到你必须给出四个浮点值。是我的错。但是Python的问题是..它不会产生任何错误。这让我的故障排除变得太困难了。没有(.Q)作为该对象(SbRotation)的子对象。我写下了正确的代码,以防其他人想使用它。

代码语言:javascript
复制
def draw_arrow(_Points=[], _color=FR_COLOR.FR_OLIVE, _ArrSize=1.0,_rotation=(1.0,1.0,1.0,0.0)):
    '''
    Draw a 3D arrow at the position given by the _Points and the color given by _color. 
    Scale it by the _ArrSize, and rotate it by the _rotation which consist of four float values(x,y,z ,and Angel), angle in radians. 
    '''
    if len (_Points)!=2:
        raise ValueError('Vertices must be 2')
    try:
        so_separatorRoot=coin.SoSeparator()
        so_separatorHead = coin.SoSeparator()
        so_separatorTail = coin.SoSeparator()
        
        transHead = coin.SoTranslation()   # decide at which position the object will be placed
        transTail = coin.SoTranslation()   # decide at which position the object will be placed
        transRoot= coin.SoTranslation()    # decide at which position the whole objects will be placed
        
        coordsRoot = coin.SoTransform()
        
        cone=coin.SoCone()
        cone.bottomRadius= 3
        cone.height= 3
        
        cylinder=coin.SoCylinder()
        cylinder.height = 10
        cylinder.radius = 0.5
        p1=_Points[0]
        p2=App.Vector(p1.x,p1.y-5,p1.z)

        styleHead = coin.SoDrawStyle()
        styleTail = coin.SoDrawStyle()
        
        styleHead.style = coin.SoDrawStyle.LINES     #draw only frame not filled
        styleHead.lineWidth = 3

        styleTail.style = coin.SoDrawStyle.LINES     #draw only frame not filled
        styleTail.lineWidth = 2
        
        coordsRoot.scaleFactor.setValue([_ArrSize,_ArrSize,_ArrSize])
        coordsRoot.translation.setValue(App.Vector(0,0,0))
        coordsRoot.rotation.setValue(_rotation) #  SbRotation (const SbVec3f &axis, const float radians)
        

        transHead.translation.setValue(p1)
        transTail.translation.setValue(p2)
        transRoot.translation.setValue(App.Vector(0.0,0.0,0.0))
        
        color=coin.SoBaseColor(); 
        color.rgb=_color
        
        so_separatorHead.addChild(color)
        so_separatorTail.addChild(color)
        
        so_separatorHead.addChild(transHead)
        so_separatorTail.addChild(transTail)

        so_separatorHead.addChild(styleHead)
        so_separatorHead.addChild(cone)
        
        so_separatorTail.addChild(styleTail)
        so_separatorTail.addChild(cylinder)

        print("rotatin",_rotation)
        so_separatorRoot.addChild(coordsRoot)       
        so_separatorRoot.addChild(transRoot)
        so_separatorRoot.addChild(so_separatorHead)
        so_separatorRoot.addChild(so_separatorTail)

        
        return so_separatorRoot
        # we have a selected object. Try to show the dimensions. 
        
    except Exception as err:
        App.Console.PrintError("'Design456_DirectScale' Failed. "
                               "{err}\n".format(err=str(err)))
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        print(exc_type, fname, exc_tb.tb_lineno)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68154034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档