2014-01-26 65 views
0

我刚刚开始使用itcl,并且找到了How to pass itcl object from one class to another?但这并没有帮助我。itcl如何将对象传递给其他对象

我有以下对象定义:

package require Itcl 

namespace eval FEM { 

    itcl::class Node { 
     variable nid 
     variable x 
     variable y 
     variable z 

     constructor {{NID 0} {coordX 0} {coordY 0} {coordZ 0}} { 
     set nid $NID 
     set x $coordX 
     set y $coordY 
     set z $coordZ 
     return $this} 

     method is {nid coordX coordY coordZ} 
     method printString 
     } 

    itcl::body Node::is {NID coordX coordY coordZ} { 
     set nid $NID 
     set x $coordX 
     set y $coordY 
     set z $coordZ}  

    itcl::body Node::printString {} { 
     return "$nid $x $y $z"} 

# ####################################################### 

    itcl::class CQUAD { 
     variable eid 
     variable pid 
     variable node1 
     variable node2 
     variable node3 
     variable node4 

     constructor {{EID 0} {PID 0} {NODE1 0} {NODE2 0} {NODE3 0} {NODE4 0}} { 
     set eid $EID 
     set pid $PID 
     set node1 $NODE1 
     set node2 $NODE2 
     set node3 $NODE3 
     set node4 $NODE4 
     return $this} 

     method is {EID PID NODE1 NODE2 NODE3 NODE4} 
     method printString 

     } 

    itcl::body CQUAD::is { EID PID NODE1 NODE2 NODE3 NODE4 } { 
     set eid $EID 
     set pid $PID 
     set node1 $NODE1 
     set node2 $NODE2 
     set node3 $NODE3 
     set node4 $NODE4}  

    itcl::body CQUAD::printString {} { 
     return "$eid $pid $node1 $node2 $node3 $node4"} 
    } 

} 

# ######################################################## 
# Test 

for {set n 1} {$n <= 4} {incr n} { 
    set coord1 [expr {$n+1} ] 
    set coord2 [expr {$n+2} ] 
    set coord3 [expr {$n+3} ] 
    set NID N$n 
    ::FEM::Node $NID $n $coord1 $coord2 $coord3 
    puts "[$NID printString]" 
} 

set PID 99 
set EID 88 

以下是错误的,因为$N1根本N1,而不是一个“节点” N1

::FEM::CQUAD MyQuad $EID $PID $N1 $N2 $N3 $N4 

但是我怎么传递类型的对象节点到CQUAD类型的对象? 我也试过:

::FEM::CQUAD MyQuad $EID $PID $::FEM:Node::N1 $::FEM:Node::N2 $::FEM:Node::N3 $::FEM:Node::N4 

另外,如何删除一个对象? unset $N1是错误unset $::FEM::Node::N1也是假

最后一个问题:假设我有与它Node类型的对象CQUAD对象: 我怎么能获得例如节点2的y坐标CQUAD 1的?

回答

1

在ITCL(如在的Tcl的其余部分),不传递对象本身,则通过名称其中消耗命令解析为参考给对象的对象的

一般来说,一个对象的名字应该作为其完全限定的名字传递,这样Tcl中的所有名字都可以理解为同样的意思。您可以使用namespace which N1获得N1。 (例外的是Tk控件名称,它必须位于全局名称空间中,通过不合格传递,始终以.开头。)

要删除对象(与包含对象名称的变量)使用:

itcl::delete object $theObjectName 

注意ITCL对象垃圾收集(但也可以使用在合适的堆栈帧的变量的删除跟踪在简单的情况下模拟这种;所述itcl::local命令使这更轻松)。

要访问public Itcl对象的变量,请使用the cget method(如果您使用过Tk,则应该非常熟悉)。

set theYcoord [[$CQUAD cget -Node2] cget -y] 

为了使一个变量是公开的,你的类定义应该说,例如:

public variable y 
public { 
    # Both x and y are to be public variables 
    variable x 
    variable y 
} 

我建议保持公共变量的数量降到最低,但这是你的商业。

+0

使用N1我得到的命名空间::: N1所以itcl :: delete节点$ :: N1应该删除它,但我得到:糟糕的选项节点,应该是....只是对我来说:N1是对象名称,“节点”是对象类型? – Lumpi

+0

要删除,'object'是一个文字字符串。所以你的情况是:itcl :: delete object :: N1 –