!***************************************************************
! WPNLBASE_NB                / 2002-12-19 / Vertex Systems
!***************************************************************

#GET_INTERFACE#

It= new_iterator("",0,"ROLED","PARAMS")
Param= next_item(It)
if !Param then exit
set_macro_param(Param) "IMP~CONNECTIONS","1"
set_macro_param(Param) "IMP~CORNER","1"
set RETURN "1"

#GET_INTERFACE#

#CORNER#

!debug ./corner.dbg

FrameConn = get(P~WPNL_FRAME_CONN)
IsStudTrack = get(P~IS_STUD_TRACK)

set RETURN "0"

It= new_iterator("",0,"ROLED","PARAMS")
Params= next_item(It)
Adapt= 0
if (Params) then Adapt= get_obj_param(Params,"ADAPT")

if (Adapt) then
  init_iterator(It) "",0,"ROLED","THIS")
  Core = next_item(It)
  if !Core then exit
else
  init_iterator(It) "",0,"ROLED","PANEL_CORE"
  Core= next_item(It)
endif 

if FrameConn then  
  Sq$ = get(P~WPNL_SCREW_QTY)
  Tol$ = get(P~TOL_NB)

  P= 1
  X= 2
  Y= 3
  Z= 4
  T= 5
  SD= 6
  O= 7
  P2= 8
  X2= 9
  Y2= 10
  Z2= 11
  D= 12
  JD= 13
  PP = 14
  PX = 15
  PY = 16
  PZ = 17
  PP2 = 18
  PX2 = 19
  PY2 = 20
  PZ2 = 21

  Ic= new_iterator("",0,"ROLED","END")
  Is= new_iterator("",0,"ROLED","END")
  loop
    Ce= next_item(Ic)
    exitif Ce<1
    Ch= get_actual_piece(Ce)
    Use$= get_piece_param(Ch,"USE")
    if findstr(Use$,"TRACK") || cmp(Use$,"BEAM SILL") || cmp(Use$,"SILL") || cmp(Use$,"HEADER") then
      Shp$= get_material_param(Ch,"SHAPE")
      if cmp(Shp$,"C") || cmp(Shp$,"U")  then
        get_origin_pos(Ce) P,X,Y,Z
        get_origin_pos(Ch) PP,PX,PY,PZ
        Min= mm_to_dwg(1000000)
        Pair= 0
        init_iterator(Is) "",0,"ROLED","END"
        loop
          Se= next_item(Is)
          exitif Se<1
          St= get_actual_piece(Se)
          Use2$= get_piece_param(St,"USE")
          
          Ok= 1
          if Adapt && !is_adapt_act_pos(St,Ch,0) then Ok= 0
          
          if (Ok && St != Ch && !findstr(Use2$,"BRACE")) then
            Shp$= get_material_param(St,"SHAPE")
            get_origin_pos(Se) P2,X2,Y2,Z2
            get_origin_pos(St) PP2,PX2,PY2,PZ2
            vec_cross_prod(D) Z,Z2
            vec_cross_prod(JD) Z2,D
            vec_sub(D) P,P2
            Dot= vec_dot_prod(D,JD)
            
            same = vec_same(PX,PX2,mm_to_dwg(0.001))
            
            if !same then
              if cmp(Shp$,"C") || cmp(Shp$,"U") then
                if cmp(Use$, "TOP TRACK") && cmp(Use2$,"TOP TRACK") then
                  Min= Dot
                  Pair= Se
                else
                  Dst= get_section_param(St,"WIDTH",1)*0.5
                  if Dot > mm_to_dwg(1) && Dot < Dst+mm_to_dwg(2) then
                    Min= Dot
                    Pair= Se
                  endif
                endif
                exitif Min < mm_to_dwg(10)
              endif
            endif
          endif
        endloop
        if Min < mm_to_dwg(60) then
          Shp1$= get_material_param(Ce,"SHAPE")
          Shp2$= get_material_param(Pair,"SHAPE")

          ! must be U C connection
          if IsStudTrack && !cmp(Shp1$,Shp2$) then
            Jnt= new_djoint("JOINT_SYS8","RS_0305C",P,X,Y,Z,0,0);
            if Jnt < 1 then exit
            set_djmember(Jnt) Ce,"END"
            set_djmember(Jnt) Pair,"END"
            set_djparam(Jnt) "PRE~SQ",Sq$
            set_djparam(Jnt) "PRE~SILENT","1"
            set_djparam(Jnt) "PRE~UCUT","1"
            set_djparam(Jnt) "PRE~CCUT","1"
            set_djparam(Jnt) "PRE~CDST",Tol$
            Done = 1
          else
            Jnt= new_djoint("JOINT_LGS","LGS_0306C",P,X,Y,Z,0)
            if Jnt < 1 then exit
            set_djmember(Jnt) Ce,"PCE"
            set_djmember(Jnt) Pair,"END"
            set_djparam(Jnt) "PRE~SILENT","1"
            set_djparam(Jnt) "PRE~ENDGAP",Tol$
            set_djparam(Jnt) "PRE~SQ",Sq$
            Done = 1
          endif
        endif
      endif
    endif
  endloop
  
  if Done then set RETURN "1"
endif

#CORNER#

#CONNECTIONS#

!debug ./connections.dbg

It= new_iterator("",0,"ROLED","PARAMS")
Params= next_item(It)
Adapt= 0
if (Params) then Adapt= get_obj_param(Params,"ADAPT")

if (Adapt) then
  init_iterator(It) "",0,"ROLED","THIS")
  Core = next_item(It)
  if !Core then exit
else
  init_iterator(It) "",0,"ROLED","PANEL_CORE"
  Core= next_item(It)
endif 

FrameConn = get(P~WPNL_FRAME_CONN)
IsStudTrack = get(P~IS_STUD_TRACK)
NotchHoriz = get(P~NOTCH_HORIZ)

if FrameConn then
  Sq$ = get(P~WPNL_SCREW_QTY)
  Vert_Tol$ = get(P~TOL_NB)
  Diag_Tol$ = get(P~TOL_DIAG)
  
  FitTole= mm_to_dwg(6.0)
  EndTole= mm_to_dwg(15.0)
  Ovrtole= mm_to_dwg(18.0)
  
  Ie= new_iterator("",0,"ROLED","END")
  Ip= new_iterator("",0,"ROLED","PCE")
  
  TP= 1;  TX= 2;  TY= 3;  TZ= 4;
  PP= 5;  PX= 6;  PY= 7;  PZ= 8;
  EP= 9;  EX= 10; EY= 11; EZ= 12;
  D= 13;  P= 14;  N= 15;  P1= 16; P2= 17;
  JP= 18; JX= 19; JY= 20; JZ= 21;
  OP= 22; OX= 23; OY= 24; OZ= 25
  FP= 26; MIN = 27; MAX = 28;
  MinX = 29; MinY = 30; MinZ = 31;
  MaxX = 32; MaxY = 33; MaxZ = 34;

  StartPt= 35; EndPt= 36; Z = 37;
  PntP = 38; PeP = 39; PeN = 40
  Dir = 41; Dir2 = 42; PP2 = 43

  GT= 1
  GP= 2

  vec_to(JP) 0,0,0
  vec_to(JX) 1,0,0
  vec_to(JY) 0,1,0
  vec_to(JZ) 0,0,1

  Done= 0
  loop
    End= next_item(Ie)
    exitif !End
    Pce= get_actual_piece(End)
  
    Mat$= get_material_param(Pce,"SHAPE")
    Hgt= get_section_param(Pce,"HEIGHT")
    Wdt= get_section_param(Pce,"WIDTH")
    Use$ = get_obj_param(Pce,"USE")
    FpType = get_obj_param(Pce,"FPTYPE")

    if cmp(Mat$,"C") || cmp(Mat$,"U") || cmp(Mat$,"HR") then
      get_vxgeom(GP) Pce
      get_origin_pos(End) EP,EX,EY,EZ
      get_origin_pos(Pce) PP,PX,PY,PZ
    
      Found= 0
      Rotated = 0
      FoundDot= 0.98
      init_iterator(Ip) "",0,"ROLED","PCE"
      loop
        Track= next_item(Ip)
        exitif !Track
        Mat2$= get_material_param(Track,"SHAPE")
        Hgt2= get_section_param(Track,"HEIGHT")
        Use2$ = get_obj_param(Track,"USE")

        Ok= 1
        if (Adapt) && !is_adapt_act_pos(Pce,Track,0) then Ok= 0

        Diff= abs(Hgt-Hgt2)
        if (Ok && Diff <= FitTole) then
          get_origin_pos(Track) TP,TX,TY,TZ
          get_vxgeom(GT) Track
  
          Ok2= 0; Ok2= 0; Ok3= 0; Ok4= 0
          if Track != Pce && (cmp(Mat2$,"C") || cmp(Mat2$,"U")) then Ok1= 1
          Dot= vec_dot_prod(TZ,EZ)
          if Dot < 0 then Dot= -Dot
          Ang= acos(Dot)
          if Ang > 10 then Ok2= 1

          vec_sub(D) EP,TP
          Dot= vec_dot_prod(D,TY)
          if abs(Dot) < FitTole then
            Ok3= 1
            Dot= vec_dot_prod(PY,TY)
            if abs(Dot) > 0.9999 then Ok4= 1
          else
            ! Probably rotated profile
            Ok= pnt_to_plane(PP2,PP,TP,TY,PX)
            vec_sub(D) PP2,TP
            Dot= vec_dot_prod(D,PX)
            if abs(Dot) < FitTole then
              Ok3= 1
              ! Check direction. Web side of backer must be side of stud
              vec_sub(D) TP,PP
              Dot= vec_dot_prod(D,PX)
              if Dot > 0 then
                Ok4= 1
                Rotated= 1
              endif
            endif
          endif
          Ok4 = is_pce_end_in_pce(End,Track) 
          
          if Ok1 && Ok2 && Ok3 && Ok4 then
            if findstr(Use$,"HORIZ") then
              Found = Track
            else            
              vec_copy(D) TX
              Ok1= proj_to_piece(P,N,EP,D,Track,0,1)
              vec_sub(D) P,EP
              Dot1= vec_dot_prod(D,TX)
              vec_rev(D) TX
              Ok2= proj_to_piece(P,N,EP,D,Track,0,1)
              vec_sub(D) P,EP
              Dot2= vec_dot_prod(D,TX)
              Count= 0
              if Dot1 < 0 then Count= Count+1
              if Dot2 < 0 then Count= Count+1
              !if Ok1 && Ok2 && Count == 1 then
              if Ok1 && Ok2 then
                if vxgeom_cross_pnts(GT,P1,GP,P2) then
                  if is_in_vxgeom(GT,P1,0,EndTole) && is_in_vxgeom(GP,P2,1,EndTole) then
                    Dot= vec_dot_prod(EZ,TZ)
                    Dot= abs(Dot)
                    if Dot < FoundDot then
                      vec_copy(FP) P1
                      Found= Track
                      FoundDot= Dot
                    endif
                  endif
                endif
              endif
            endif
          endif
        endif
      endloop
      if Found then
        Track= Found
        Ok1= 0
        Ok2= 0
        get_origin_pos(Track) TP,TX,TY,TZ
        Dot= vec_dot_prod(EZ,TX)
        if Dot < 0 then Ok1= 1
        Zc= vec_get_z(EZ)
        if abs(Zc) > mm_to_dwg(0.01) then Ok2= 1
        Ok3 = vec_same(TX,EZ,mm_to_dwg(0.01))

        Shp1$= get_material_param(End,"SHAPE")
        Shp2$= get_material_param(Track,"SHAPE")
        
        Horiz_Tol = get_section_param(Track,"THICK")
        Horiz_Tol$ = Horiz_Tol

        if !Rotated then
          if IsStudTrack && !cmp(Shp1$,Shp2$) then
            if Ok1 && Ok2 then
              Jnt= new_djoint("JOINT_SYS8","RS_0305A",JP,JX,JY,JZ,0,0)
              set_djmember(Jnt) Track,"PCE"
              set_djmember(Jnt) End,"END"
              set_djparam(Jnt) "PRE~SQ",Sq$
              set_djparam(Jnt) "PRE~SILENT","1"
              set_djparam(Jnt) "PRE~CCUT","1"
              if FpType == 18 || FpType == 41 then
                set_djparam(Jnt) "PRE~CDST",Diag_Tol$
              else
                set_djparam(Jnt) "PRE~CDST",Vert_Tol$
              endif
              Done= 1
            else
              Jnt= new_djoint("JOINT_SYS8","RS_0305B",JP,JX,JY,JZ,0,0)
              set_djmember(Jnt) Track,"PCE"
              set_djmember(Jnt) End,"END"
              set_djparam(Jnt) "PRE~SQ",Sq$
              set_djparam(Jnt) "PRE~SILENT","1"
              set_djparam(Jnt) "PRE~UCUT","1"
              set_djparam(Jnt) "PRE~UDST",Horiz_Tol$
              Done= 1
            endif
          else
            if NotchHoriz then
              if Ok1 && Ok2 then
                Jnt= new_djoint("JOINT_LGS","LGS_0306A",JP,JX,JY,JZ,0)
                if Jnt < 1 then exit
                set_djmember(Jnt) Track,"PCE"
                set_djmember(Jnt) End,"END"
                set_djparam(Jnt) "PRE~SQ",Sq$
                set_djparam(Jnt) "PRE~SILENT","1"
                set_djparam(Jnt) "PRE~FULLDIMPLE","0"
                if FpType == 18 || FpType == 41 then
                  set_djparam(Jnt) "PRE~ENDGAP",Diag_Tol$
                else
                  set_djparam(Jnt) "PRE~ENDGAP",Vert_Tol$
                endif
                Done= 1
              else
                Jnt= new_djoint("JOINT_LGS","LGS_0306B",JP,JX,JY,JZ,0)
                if Jnt < 1 then exit
                set_djmember(Jnt) Track,"PCE"
                set_djmember(Jnt) End,"END"
                set_djparam(Jnt) "PRE~SQ",Sq$
                set_djparam(Jnt) "PRE~SILENT","1"          
                Done= 1
              endif
            else
              if Ok1 && !Ok3 then
                Jnt= new_djoint("JOINT_LGS","LGS_0306A",JP,JX,JY,JZ,0)
                if Jnt < 1 then exit
                set_djmember(Jnt) Track,"PCE"
                set_djmember(Jnt) End,"END"
                set_djparam(Jnt) "PRE~SQ",Sq$
                set_djparam(Jnt) "PRE~SILENT","1"
                set_djparam(Jnt) "PRE~FULLDIMPLE","0"
                if FpType == 18 || FpType == 41 then
                  set_djparam(Jnt) "PRE~ENDGAP",Diag_Tol$
                else
                  set_djparam(Jnt) "PRE~ENDGAP",Vert_Tol$
                endif
                Done= 1
              else
                Jnt= new_djoint("JOINT_LGS","LGS_0306B",JP,JX,JY,JZ,0)
                if Jnt < 1 then exit
                set_djmember(Jnt) Track,"PCE"
                set_djmember(Jnt) End,"END"
                set_djparam(Jnt) "PRE~SQ",Sq$
                set_djparam(Jnt) "PRE~SILENT","1"          
                Done= 1
              endif
            endif
          endif
        else
          Jnt= new_djoint("JOINT_LGS","LGS_0615AA",JP,JZ,JY,JZ,0,0);
          if !Jnt then exit
          set_djmember(Jnt) Pce,"PCE"
          set_djmember(Jnt) Track,"PCE2"
          set_djparam(Jnt) "PRE~SQ",Sq$
          set_djparam(Jnt) "PRE~SILENT","1"
          Done= 1
        endif
      endif
    endif
  endloop

  if Done then set RETURN "1"
endif

#CONNECTIONS#

