怎么快速建立孔与孔间刚性连接

浏览:56334 回答:14
我记得以前哪位大侠编了一个小程序,可以实现孔与孔之间快速建立刚性连接,即通过点击两个孔各一个节点,就可以实现把两个孔所有节点全部选上,之后就可以完成一个刚性连接。 哪位能有?或给个连接地址也行,谢谢
邀请回答 我来回答

全部回答

(14)
默认 最新
winken
谢谢
2014年12月17日
评论 点赞
飞火流星123
HM可以,用patran里的MPC单元也行
2014年12月16日
评论 点赞
史爱民
直接 file run tcl 即可
2014年12月16日
评论 点赞
winken
这个可以实现该功能,留个邮箱 我给你发过去 今天论坛怎么发不了附件啊?
bit812 发表于 2014/12/11 8:10:00 非常感谢,文件我已经收到,顺便问一下,这个.tcl文件放入哪个目录下可以用起来,放入目录下后,我还需要哪些操作?
2014年12月16日
评论 点赞
winken
这个可以实现该功能,留个邮箱 我给你发过去 今天论坛怎么发不了附件啊?
bit812 发表于 2014/12/11 8:10:00 无论怎样,都非常感谢您的辛劳。我的邮箱是vken_zu@126.com,先发给我使用一下,好用的话我给你宣传一下,谢谢。
2014年12月12日
评论 点赞
史爱民
这个可以实现该功能,留个邮箱 我给你发过去 今天论坛怎么发不了附件啊?
2014年12月11日
评论 点赞
史爱民

package require hwtpackage require hwat#***************************************************************************# Purpose : get the min value and the index from a list# Args : # - real_list# Returns :# - min_list {index,min_val}# Notes :#*************************************************************************** proc GetMinValFromList { real_list } { # sort the list by real type set sorted_list [lsort -real $real_list] set min_val [lindex $sorted_list 0] set min_index [lsearch -exact $real_list $min_val] set ret_list [list $min_index $min_val] return $ret_list} #***************************************************************************# Purpose : caculate the distance between the two points# Args : # start_point [list x y z]# end_point [list x y z]# Returns : # Notes :#*************************************************************************** proc AskDistanceBetweenTwoPoints {start_point end_point} { set start_pointx [lindex $start_point 0] set start_pointy [lindex $start_point 1] set start_pointz [lindex $start_point 2] set point2x [lindex $end_point 0] set point2y [lindex $end_point 1] set point2z [lindex $end_point 2] set Dx [expr pow(($point2x - $start_pointx),2)] set Dy [expr pow(($point2y - $start_pointy),2)] set Dz [expr pow(($point2z - $start_pointz),2)] set dist1 [expr $Dx + $Dy + $Dz] set dist [expr sqrt( $dist1 )] return $dist}#***************************************************************************# Purpose : caculate the normal vector given three points# Args : # start_point [list x y z]# end_point [list x y z]# outside_point [list x y z]# Returns : # Notes :#*************************************************************************** proc AskNormalThruThreePoints { start_point end_point outside_point } { set vector1 [::hwat::math::GetVector $start_point $end_point] set vector2 [::hwat::math::GetVector $start_point $outside_point] set normal1 [::hwat::math::VectorCrossProduct $vector1 $vector2] set normal [::hwat::math::VectorNormalize $normal1] return $normal}#***************************************************************************# Purpose : remove an item from a list# Args : # -rlist# -ritem# Returns : # Notes :#*************************************************************************** proc RemoveItemFromList { rlist ritem } { set list_index [lsearch -exact $rlist $ritem] set ret_list [lreplace $rlist $list_index $list_index] return $ret_list;}#***************************************************************************# Purpose : generate three different integers from a integer list# Args : # arguments # -1. node1# -2. node2# -3. node3# Returns :# - center node id# Notes :#*************************************************************************** proc Generate3RandInt { int_list } { set temp_list $int_list; # NO1 set list_count [llength $temp_list]; set list_index [expr {int($list_count*rand())}]; set n_node1 [lindex $temp_list $list_index] # NO2 set temp_list [RemoveItemFromList $temp_list $n_node1] set list_count [llength $temp_list]; set list_index [expr {int($list_count*rand())}]; set n_node2 [lindex $temp_list $list_index] # NO3 set temp_list [RemoveItemFromList $temp_list $n_node2] set list_count [llength $temp_list]; set list_index [expr {int($list_count*rand())}]; set n_node3 [lindex $temp_list $list_index] set ret_list [list $n_node1 $n_node2 $n_node3] return $ret_list}#***************************************************************************# Purpose : caculate one point on a line from a distance# Args : # start_point [list x y z] line end 1# line_vector [list x y z] vector# distance# Returns : # - a point list {x_coord,y_coord,z_coord}# Notes :#*************************************************************************** proc AskPointOnVectorByDistance { start_point line_vector dist } { set normal_vector [::hwat::math::VectorNormalize $line_vector] set vec_x [lindex $normal_vector 0] set vec_y [lindex $normal_vector 1] set vec_z [lindex $normal_vector 2] set start_point_x [lindex $start_point 0] set start_point_y [lindex $start_point 1] set start_point_z [lindex $start_point 2] set target_x [expr $start_point_x+$dist*$vec_x] set target_y [expr $start_point_y+$dist*$vec_y] set target_z [expr $start_point_z+$dist*$vec_z] #*createnode $target_x $target_y $target_z 0 0 0 set target_point [list $target_x $target_y $target_z] return $target_point}#***************************************************************************# Purpose : creates the center node at the specified location# Args : # arguments # -1. node1# -2. node2# -3. node3# Returns :# - center node id# Notes :#*************************************************************************** proc CreateCenterNodeByThreeNodes args \{ set center ""; set node1 [lindex $args 0]; set node2 [lindex $args 1]; set node3 [lindex $args 2]; *createcenternode $node1 $node2 $node3 0 0 0; *createmark nodes 1 -1; set node_list [hm_getmark nodes 1]; foreach node_id $node_list \ { set center $node_id; } return $center;}#***************************************************************************# Purpose : get node attached rigidlink elems# Args : # arguments # -one node# Returns :# rigid link id# Notes :#*************************************************************************** proc GetRigidlinkElemIDByNode {n_nodeID} { *clearmark nodes 1 *createmark nodes 1 $n_nodeID *findmark nodes 1 1 0 elems 0 2 # get the element ids attached to the picked node; usually i got four elems set rigidlink_ids [hm_getmark elems 2] foreach rigidlink_id $rigidlink_ids { set elem_config [hm_getentityvalue elems $rigidlink_id config 0] if { $elem_config==5 || $elem_config==55 || $elem_config==56 } { return $rigidlink_id } }}#***************************************************************************# Purpose : # get right element type# Args : # arguments # -one node# Returns :# shell or not# Notes :#*************************************************************************** proc CheckElemTypeByNode { n_nodeID } { set is_solid 0 *clearmark nodes 1 *createmark nodes 1 $n_nodeID if { [hm_marklength nodes 1]>0 } { *findmark nodes 1 1 0 elems 0 2 set n_pickedNodeElemsList [hm_getmark elems 2] foreach elem_id $n_pickedNodeElemsList { set elem_config [hm_getentityvalue elems $elem_id config 0] # shell elements etc; Tria3 Tria6 Quad4 Quad8 Hex8 # if { $elem_config==103 || $elem_config==104 || $elem_config==106 \# || $elem_config==108 || $elem_config==208 } {# break# } if { $elem_config==204 || $elem_config==210 || $elem_config==208 || $elem_config==220 } { set is_solid 1 break } } } return $is_solid}#***************************************************************************# Purpose : get node attached rigidlink elems# Args : # arguments # -one node# Returns :# rigid link id# Notes :#*************************************************************************** proc MakeFindEdgeWork { n_rigidNodesList } { set n_edgeNodeID [lindex $n_rigidNodesList 0] set n_rigidNodes [lindex $n_rigidNodesList 1] # remove ^faces comp *clearmark comps 1 *createmark comps 1 "by name" "^faces" if { [hm_marklength comps 1]>0 } { *deletemark comps 1 } #*entityhighlighting 0 # Tetra4 Tetra10 *clearmark comps 1 *createmark comps 1 "displayed" *findfaces comps 1 # got one face to show *clearmark nodes 1 *createmark nodes 1 $n_edgeNodeID *findmark nodes 1 1 0 elems 0 1 *clearmark elems 2 *createmark elems 2 "by name" "^faces" *markintersection elems 1 elems 2 set n_shellElems [hm_getmark elems 1] *clearmark elems 1 *createmark elems 1 [lindex $n_shellElems 0] *appendmark elems 1 "by face" *maskentitymark elems 1 0 *maskreverse elems # to find edge if { $n_rigidNodes!="" } { *clearmark comps 1 *createmark comps 1 "by name" "^edges" if { [hm_marklength comps 1]>0 } { *deletemark comps 1 } *clearmark elems 1 *createmark elems 1 "displayed" *findedges elems 1 0 *clearmark elems 2 *createmark elems 2 "by name" "^edges" if { [hm_marklength elems 2]>0 } { *findmark elems 2 1 0 nodes 0 1 *clearmark nodes 2 eval *createmark nodes 2 $n_rigidNodes *markintersection nodes 1 nodes 2 set n_edgeNodesList [hm_getmark nodes 1] return [lindex $n_edgeNodesList 0] } } #*entityhighlighting 1 return $n_edgeNodeID}#***************************************************************************# Purpose : get a group of loop edge nodes# Args : # - edge node id# - main frame; show modal dialog# Returns :# first loop edge nodes list# Notes :#*************************************************************************** proc GetLoopShellEdgeNodes { n_nodeID frm_parent } { # remove ^edges comp *clearmark comps 1 *createmark comps 1 "by name" "^edges" if { [hm_marklength comps 1]>0 } { *deletemark comps 1 } #-------------------------------------------------------------------------------------- #Get the edge of all elems first #-------------------------------------------------------------------------------------- *clearmark elems 1 *createmark elems 1 "displayed" if { [hm_marklength elems 1]>0 } { *findedges elems 1 0 } else { # remove ^faces comp *clearmark comps 1 *createmark comps 1 "by name" "^faces" if { [hm_marklength comps 1]>0 } { *deletemark comps 1 } tk_messageBox -message "No connecting element is found." -parent $frm_parent *unmaskall hm_redraw return } #-------------------------------------------------------------------------------------- # Get the first element on the edge # or ::hwat::utils::FindAttachedEntityToGivenEntity #-------------------------------------------------------------------------------------- *clearmark nodes 1 *createmark nodes 1 $n_nodeID if { [hm_marklength nodes 1]>0 } { *findmark nodes 1 1 0 elems 0 2 # get the element ids attached to the picked node; usually i got four elems set n_pickedNodeElemsList [hm_getmark elems 2] if { $n_pickedNodeElemsList=="" } { *createmark comps 1 "^edges" if { [hm_marklength comps 1]>0 } { *deletemark comps 1 } tk_messageBox -message "No connecting element is found." -parent $frm_parent *unmaskall *clearmark comps 1 *createmark comps 1 "by name" "^faces" if {[hm_marklength comps 1]>0} { *deletemark comps 1 } hm_redraw return; } } else { return } *clearmark elems 1 foreach elem_id $n_pickedNodeElemsList { # get element configuration for the attached elems to the picked node; # ^edges component contains elems with config=2 set elem_config [hm_getentityvalue elems $elem_id config 0] # if config is 2 (plotels) append elems of config 2 to mark 1 if { $elem_config == 2 } { *appendmark elems 1 "by id" $elem_id } } # element ids of config 2 or free edges; usually i got two elems set n_pickedNodeEdgeElemsList [hm_getmark elems 1] if { $n_pickedNodeEdgeElemsList=="" } { *createmark comps 1 "^edges" if { [hm_marklength comps 1]>0 } { *deletemark comps 1 } tk_messageBox -message "Please select a node along the edge!" -parent $frm_parent *unmaskall # remove ^faces collector *clearmark comps 1 *createmark comps 1 "by name" "^faces" if {[hm_marklength comps 1]>0} { *deletemark comps 1 } hm_redraw return; } *clearmark comps 1 *createmark comps 1 all *displaycollectorsbymark comps 1 off 1 0 *displaycollectorwithfilter comps "on" "^edges" 1 1 # append other edge elems to the first mark *clearmark elems 1 eval *createmark elems 1 $n_pickedNodeEdgeElemsList *appendmark elems 1 "by attached" set n_edgeElemsList [hm_getmark elems 1] set n_spiderNodesList [GetFreeEdgeElemLoopNodesList $n_edgeElemsList] # remove ^edges colector *clearmark comps 1 *createmark comps 1 "by name" "^edges" if {[hm_marklength comps 1]>0} { *deletemark comps 1 } *unmaskall *clearmark comps 1 *createmark comps 1 all *displaycollectorsbymark comps 1 on 1 0 # remove ^faces collector *clearmark comps 1 *createmark comps 1 "by name" "^faces" if {[hm_marklength comps 1]>0} { *deletemark comps 1 } return $n_spiderNodesList}proc GetFreeEdgeElemLoopNodesList { n_edgeElemsList } { set n_loopEdgeNodesList "" foreach elem_id $n_edgeElemsList { set node_id1 [hm_getentityvalue elems $elem_id "node1.id" 0] set node_id2 [hm_getentityvalue elems $elem_id "node2.id" 0] lappend n_loopEdgeNodesList $node_id1 lappend n_loopEdgeNodesList $node_id2 } set ret_list [lsort -unique $n_loopEdgeNodesList] return $ret_list}#***************************************************************************# Purpose : create rbe elems by one edge node of hole or irregular pocket# Args : # - rbe type; RBE2 or RBE3# - spider center node id# - rigid nodes list# Returns :# rigid id# Notes :#*************************************************************************** proc CreateRigidlink { str_rbeType n_spiderCenterNodeID n_rbeNodesList } { if {[string match $str_rbeType "RBE2"]} { *clearmark nodes 2 eval *createmark nodes 2 $n_rbeNodesList *rigidlink $n_spiderCenterNodeID 2 123456 } else { set arr_dof {} set arr_weight {} set n_rbeNodesListLength [llength $n_rbeNodesList] foreach x $n_rbeNodesList { lappend arr_dof 123456 lappend arr_weight 1 } *clearmark nodes 2 eval *createmark nodes 2 $n_rbeNodesList eval *createarray $n_rbeNodesListLength $arr_dof eval *createdoublearray $n_rbeNodesListLength $arr_weight *rbe3 2 1 $n_rbeNodesListLength 1 $n_rbeNodesListLength $n_spiderCenterNodeID 123456 1 } set rigidlink_id [GetRigidlinkElemIDByNode $n_spiderCenterNodeID] set ret_list [list $n_spiderCenterNodeID $rigidlink_id] return $ret_list;}#***************************************************************************# Purpose : Create a csys by node and return a csys id for load# Args : # - str_colName# - n_originNodeID# - by_mesh 1; by surface 0 by y-axis 2# - y_pos ; +y axis or negative# Return :# - csys id# Notes :# #*************************************************************************** proc CreateStandardYAxisCSYSID { n_originNodeID vector_y vector_x } { set normal_vector [::hwat::math::VectorNormalize $vector_y] # a temp node as the orgin_node *clearmark nodes 1; *createmark nodes 1 $n_originNodeID; *duplicatemark nodes 1 25; *clearmark nodes 1 *createmark nodes 1 -1 set temp_csys_origin [hm_getmark nodes 1]; set orgin_coords [lindex [hm_nodevalue $temp_csys_origin] 0] # get a node with x-axis based on origin node set x_axis_point [AskPointOnVectorByDistance $orgin_coords $vector_x 1.0] set x_axis_node [::hwat::utils::CreateTempNode $x_axis_point] # get another node with y-axis based on origin node set y_axis_point [AskPointOnVectorByDistance $orgin_coords $normal_vector 1.0] set y_axis_node [::hwat::utils::CreateTempNode $y_axis_point] *systemsize 100# *systemcreate3nodes 0 $temp_csys_origin "y-axis" $y_axis_node "xy-plane" $x_axis_node #### *createmark nodes 1 $temp_csys_origin *systemcreate 1 0 $temp_csys_origin "y-axis" $y_axis_node "xy plane" $x_axis_node; # remove these two temp ndoes *clearmark nodes 1 eval *createmark nodes 1 $x_axis_node $y_axis_node $temp_csys_origin *nodemarkcleartempmark 1 # get csys id set csys_id [hm_entitymaxid systems] return $csys_id}#***************************************************************************# Purpose : calculate center point and normal of a group of loop nodes list# Args : # - n_spiderNodesList# Returns :# list [center node; nodes normal vector]# Notes :#*************************************************************************** proc CalcLoopEdgeNodesCenterNormal { n_spiderNodesList } { # randomly select three nodes to create a circle center node set temp_list [Generate3RandInt $n_spiderNodesList] set n_spiderNode1 [lindex $temp_list 0] set n_spiderNode2 [lindex $temp_list 1] set n_spiderNode3 [lindex $temp_list 2] # use createlist mode to get center temp node id set n_centerNodeID [CreateCenterNodeByThreeNodes $n_spiderNode1 $n_spiderNode2 $n_spiderNode3] if {$n_centerNodeID=="" || $n_centerNodeID==0 } { hm_errormessage "Can't find the center for the hole." hm_redraw return; } # any node coordinates of three set x0 [ hm_getentityvalue nodes $n_spiderNode1 "x" 0 ] set y0 [ hm_getentityvalue nodes $n_spiderNode1 "y" 0 ] set z0 [ hm_getentityvalue nodes $n_spiderNode1 "z" 0 ] # center node coordinates set xc [ hm_getentityvalue nodes $n_centerNodeID "x" 0 ] set yc [ hm_getentityvalue nodes $n_centerNodeID "y" 0 ] set zc [ hm_getentityvalue nodes $n_centerNodeID "z" 0 ] set dist [expr sqrt(($x0-$xc)*($x0-$xc) + ($y0-$yc)*($y0-$yc) +($z0-$zc)*($z0-$zc))] set d_holeRadius [expr int($dist*100.0)/100.0] set xcoord [ hm_getentityvalue nodes $n_centerNodeID "x" 0 ] set ycoord [ hm_getentityvalue nodes $n_centerNodeID "y" 0 ] set zcoord [ hm_getentityvalue nodes $n_centerNodeID "z" 0 ] set xAvg 0 set yAvg 0 set zAvg 0 set num [llength $n_spiderNodesList] foreach node_id $n_spiderNodesList { set xc [ hm_getentityvalue nodes $node_id "x" 0 ] set yc [ hm_getentityvalue nodes $node_id "y" 0 ] set zc [ hm_getentityvalue nodes $node_id "z" 0 ] set xAvg [expr $xAvg + $xc] set yAvg [expr $yAvg + $yc] set zAvg [expr $zAvg + $zc] } set xcoord [expr $xAvg/$num] set ycoord [expr $yAvg/$num] set zcoord [expr $zAvg/$num] set point_spiderCenter [list $xcoord $ycoord $zcoord] # remove temp node n_center *clearmark nodes 1 *createmark nodes 1 $n_centerNodeID *nodemarkcleartempmark 1 # create one node to be as spider center *createnode $xcoord $ycoord $zcoord 0 0 0 *createmark nodes 1 -1; set n_spiderCenterNodeID [hm_getmark nodes 1]; #-------------------------------------------------------------------------------------- # Get the hole radius by averaging the distances between the hole center and each of # the nodes around the hole #-------------------------------------------------------------------------------------- set dist 0.0 foreach node_id $n_spiderNodesList { set point_spiderNode [lindex [hm_nodevalue $node_id] 0]; set dist1 [AskDistanceBetweenTwoPoints $point_spiderCenter $point_spiderNode] set dist [expr $dist+$dist1] } set d_holeRadius [expr $dist/$num] # find normal set point_spiderNode1 [lindex [hm_nodevalue $n_spiderNode1] 0]; set point_spiderNode2 [lindex [hm_nodevalue $n_spiderNode2] 0]; set point_spiderNode3 [lindex [hm_nodevalue $n_spiderNode3] 0]; set vector_holeNormal [AskNormalThruThreePoints $point_spiderNode1 $point_spiderNode2 $point_spiderNode3] set ret_list [list $n_spiderCenterNodeID $vector_holeNormal $d_holeRadius] return $ret_list }#***************************************************************************# Purpose : create rbe elems by one edge node of hole or irregular pocket# Args : # - edge node id# - rbe type; RBE2 or RBE3# - rbe col name; rigid element collector name# - offset distance; from the edge node# - main frame; show modal dialog# Returns :# rigid id# Notes :#*************************************************************************** proc UpdateRigidlinkNodesByOffset {n_spiderNodesList d_offset} { # get spider nodes center and normal vector set calc_list [CalcLoopEdgeNodesCenterNormal $n_spiderNodesList] set n_spiderCenterNodeID [lindex $calc_list 0] set vector_holeNormal [lindex $calc_list 1] set d_holeRadius [lindex $calc_list 2] if { [expr abs($d_offset)]>$d_holeRadius } { set d_offset $d_holeRadius } set point_spiderCenter [lindex [hm_nodevalue $n_spiderCenterNodeID] 0] set n_rigidNodesList {}; set n_originCSYSID [hm_entitymaxid systems] # create csys-based block; use block dist as offset value set k 0 foreach edge_node $n_spiderNodesList { #puts "edge node: $edge_node" set d_edgeNodeXYZ [lindex [hm_nodevalue $edge_node] 0] set d_edgeNodeVector [::hwat::math::GetVector $point_spiderCenter $d_edgeNodeXYZ]; incr k set csys_id [CreateStandardYAxisCSYSID $edge_node $vector_holeNormal $d_edgeNodeVector] #puts "[llength $n_spiderNodesList]- $k - $csys_id" if { $csys_id!=0 } { set xlowerBound [expr -0.05] set ylowerBound [expr -20] set zlowerBound [expr -2] set xupperBound [expr $d_offset+0.05] set yupperBound [expr 20] set zupperBound [expr 2] set block_name [format "load_block_%d" $edge_node] *clearmark blocks 1 *createmark blocks 1 $block_name if {[hm_getmark blocks 1] != ""} { *deletemark blocks 1 } if { [ catch { *createblockwithsystem $block_name 11 $csys_id \ $xlowerBound $ylowerBound $zlowerBound $xupperBound $yupperBound $zupperBound } rcode] } {# puts "Error info: $rcode" } *createmark nodes 2 "by block name" $block_name set n_blockNodesList [hm_getmark nodes 2] foreach item $n_blockNodesList { lappend n_rigidNodesList $item } } } set n_lastCSYSID [hm_entitymaxid systems] #remove temp csys *clearmark systems 1 eval *createmark systems 1 [expr $n_originCSYSID+1]-$n_lastCSYSID if {[hm_getmark systems 1] != ""} { *deletemark systems 1 } # remove all temp geometry foreach edge_node $n_spiderNodesList { set block_name [format "load_block_%d" $edge_node] *clearmark blocks 1 *createmark blocks 1 $block_name if {[hm_getmark blocks 1] != ""} { *deletemark blocks 1 } } # kick off those nodes which don't belong to source comps # get comps which nodes are located *clearmark nodes 1 eval *createmark nodes 1 $n_spiderNodesList *findmark nodes 1 1 0 comps 0 2 set src_comp [hm_getmark comps 2] # get all nodes belong to these comps *clearmark nodes 1 eval *createmark nodes 1 "by comp" $src_comp set n_rbeNodesList [lsort -unique $n_rigidNodesList] *clearmark nodes 2 eval *createmark nodes 2 $n_rbeNodesList *markintersection nodes 1 nodes 2 set n_qualNodesList [hm_getmark nodes 1] set ret_list [list $n_spiderCenterNodeID $n_qualNodesList] return $ret_list}#***************************************************************************# Purpose : create rbe elems by one edge node of hole or irregular pocket# Args : # - edge node id# - rbe type; RBE2 or RBE3# - rbe col name; rigid element collector name# - main frame; show modal dialog# Returns :# rigid id# Notes :#*************************************************************************** proc CreateRigidlinkByHoleEdgeNodeEx {n_nodeID str_rbeType str_rbeColName frm_parent} { set feat_angle [hm_getoption feature_angle] *featureangleset 68.0 set n_edgeNodeID $n_nodeID # get loop edge nodes set is_solid [CheckElemTypeByNode $n_nodeID] if { $is_solid==1 } { set n_edgeNodeID [MakeFindEdgeWork $n_nodeID] } set n_spiderNodesList [GetLoopShellEdgeNodes $n_edgeNodeID $frm_parent] if { [llength $n_spiderNodesList]== 0 } { return } # update rigid nodes to offset distance scope set rigid_list [UpdateRigidlinkNodesByOffset $n_spiderNodesList 0.0] set n_spiderCenterNodeID [lindex $rigid_list 0] set n_rigidNodesList [lindex $rigid_list 1] *clearmark comps 1 *createmark comps 1 $str_rbeColName if {[hm_getmark comps 1]==""} { *collectorcreate comps $str_rbeColName "" [expr {int(64 * rand())}] } *currentcollector comps $str_rbeColName set ret_list [CreateRigidlink $str_rbeType $n_spiderCenterNodeID $n_rigidNodesList] # remove temp node *clearmark nodes 1 *createmark nodes 1 $n_spiderCenterNodeID *nodemarkcleartempmark 1 *featureangleset $feat_angle return $ret_list}#***************************************************************************# Purpose : create rbe elems by one edge node of hole or irregular pocket# Args : # - spider center node id# - rbe type; RBE2 or RBE3# - rbe col name; rigid element collector name# - offset distance# - main frame; show modal dialog# Returns :# rigid id# Notes :#*************************************************************************** proc UpdateRigidlinkBySpiderCenter { n_spiderCenterNodeID str_rbeType str_rbeColName d_offset frm_parent } { set feat_angle [hm_getoption feature_angle] *featureangleset 68.0 # get an edge node from set temp_list [GetRigidlinkEdgeNodeBySpiderCenter $n_spiderCenterNodeID] set old_rigidlink [lindex $temp_list 0] set n_rigidNodesList [lindex $temp_list 1] if { $old_rigidlink==0 || $old_rigidlink=="" } { tk_messageBox -message "No rigidlink elements found." -parent $frm_parent *featureangleset $feat_angle return } # get old_rigidlink owned comp set str_rbeColName [hm_getentityvalue elems $old_rigidlink collector.name 1 -byid] # remove this rigidlink *clearmark elems 2 *createmark elems 2 $old_rigidlink if { [hm_getmark elems 2]!="" } { *deletemark elems 2 } #puts "edge node: $n_edgeNodeID" # get loop edge nodes set n_edgeNodeID [lindex $n_rigidNodesList 0] set is_solid [CheckElemTypeByNode $n_edgeNodeID] if { $is_solid==1 } { set n_edgeNodeID [MakeFindEdgeWork $n_rigidNodesList] } set n_spiderNodesList [GetLoopShellEdgeNodes $n_edgeNodeID $frm_parent] if { [llength $n_spiderNodesList]== 0 } { return } # update rigid nodes to offset distance scope set rigid_list [UpdateRigidlinkNodesByOffset $n_spiderNodesList $d_offset] set n_spiderCenterNodeID [lindex $rigid_list 0] set n_rigidNodesList [lindex $rigid_list 1] *currentcollector comps $str_rbeColName set ret_list [CreateRigidlink $str_rbeType $n_spiderCenterNodeID $n_rigidNodesList] # remove temp node *clearmark nodes 1 *createmark nodes 1 $n_spiderCenterNodeID *nodemarkcleartempmark 1 *featureangleset $feat_angle return $ret_list}#***************************************************************************# Purpose : get one existing rigidlink edge node by center node# Args : # - center node id# Returns :# - ret_list [rigidlink id; one rigidlink edge node]# Notes :#*************************************************************************** proc GetRigidlinkEdgeNodeBySpiderCenter { n_spiderCenterNodeID } { set n_rigidNodesList "" # get an edge node from set n_edgeNodeID 0 set old_rigidlink [GetRigidlinkElemIDByNode $n_spiderCenterNodeID] if { $old_rigidlink!=0 } { # get all rigidlink nodes *clearmark elems 1 *createmark elems 1 $old_rigidlink *findmark elems 1 1 0 nodes 0 2 set n_rigidNodesList [hm_getmark nodes 2] # remove spider center self set idx [lsearch $n_rigidNodesList $n_spiderCenterNodeID] set n_rigidNodesList [lreplace $n_rigidNodesList $idx $idx] # calc distance to spider center node set dist_list {} set point_spiderCenter [lindex [hm_nodevalue $n_spiderCenterNodeID] 0] foreach node_id $n_rigidNodesList { set point_rigidNode [lindex [hm_nodevalue $node_id] 0] set dist [AskDistanceBetweenTwoPoints $point_spiderCenter $point_rigidNode] lappend dist_list $dist } # get the min distance value, that node must be the edge node set min_list [GetMinValFromList $dist_list] set n_edgeNodeID [lindex $n_rigidNodesList [lindex $min_list 0]] } set ret_list [list $old_rigidlink [list $n_edgeNodeID $n_rigidNodesList] ] return $ret_list}# select one node *createentitypanel node "Select one node only..." set n_pickedNodeID [hm_info lastselectedentity node] hm_highlightentity node 0 normal CreateRigidlinkByHoleEdgeNodeEx $n_pickedNodeID "RBE2" "rigidlink_by_$n_pickedNodeID" .
2014年12月11日
评论 点赞
winken

是怎么个方便法 啊 我现在正在搞二次开发,说出来想实现的功能 我来试试给你编一个。
bit812 发表于 2014/11/27 8:08:00 无论时体单元,还是壳单元,只要时孔与孔的连接都可以搞定,实际上就是控制某范围内节点全部选上,之后就生成刚性连接单元了,用起来非常方便,我以前有的,现在不知道放那个电脑上了,就是找不到,也是以前同事通过HM二次开发帮忙搞的,很简单,但是我不会哪种语言。
2014年12月10日
评论 点赞
史爱民

是怎么个方便法 啊 我现在正在搞二次开发,说出来想实现的功能 我来试试给你编一个。
2014年11月27日
评论 点赞
旺仔

貌似这个直接在hm中操作也很方便的
2014年11月26日
评论 点赞

没解决?试试专家一对一服务

换一批
    App下载
    技术邻APP
    工程师必备
    • 项目客服
    • 培训客服
    • 平台客服

    TOP