shjung 1 year ago
parent
commit
d016bbe260

+ 1 - 1
conf/debug.properties

@@ -1,5 +1,5 @@
 #system debug setting configuration...
-#Tue Sep 19 11:57:47 KST 2023
+#Tue Oct 31 12:28:11 KST 2023
 packet-info=1001
 packet-dump=1001
 system-debug=true

+ 4 - 2
src/main/java/com/its/vms/domain/VmsForm.java

@@ -291,6 +291,8 @@ public class VmsForm implements Serializable {
                 case 167: //@우회소통정보이미지
                 case 200: //동영상
                 case 300: //스티리밍영상
+                //case 201: //동영상 스넵샷 이미지
+                //case 301: //스티리밍영상 대표 이미지
                 case 406: //@통합대기등급 이미지
                 case 407: //@미세먼지등급 이미지
                 case 408: //@초미세먼지등급 이미지
@@ -305,7 +307,7 @@ public class VmsForm implements Serializable {
                             pFormObj.getDsplHeight(),
                             bitmapId);
 
-                    sCont = String.format("%02X%02X%s", objType, sTmp.length(), sTmp);
+                    sCont = String.format("%02X%02X%s", (byte)(objType & 0xFF), (byte)(sTmp.length() & 0xFF), sTmp);
                     msgData.append(sCont);
                     break;
                 case  3: //소통정보배경이미지
@@ -323,7 +325,7 @@ public class VmsForm implements Serializable {
                             pFormObj.getDsplHeight(),
                             bitmapId);
 
-                    sCont = String.format("%02X%02X%s", objType, sTmp.length(), sTmp);
+                    sCont = String.format("%02X%02X%s", (byte)(objType & 0xFF), (byte)(sTmp.length() & 0xFF), sTmp);
                     msgData.append(sCont);
 
                     String sVertex = "";

+ 17 - 2
src/main/java/com/its/vms/domain/VmsFormObject.java

@@ -55,6 +55,8 @@ public class VmsFormObject implements Serializable {
 
     private eVmsImageType bitmapType;
     private int bitmapId;
+    private String videoFileName;
+    private String strmAddr;
 
     public VmsFormObject(Integer vmsFormId, Integer vmsFormObjectId) {
         this.objectKind = eVmsFormObjectKind.OBJECT_TEXT;
@@ -64,6 +66,8 @@ public class VmsFormObject implements Serializable {
         this.imageData = null;
         this.fontClr = Color.BLACK;
         this.bitmapId = 0;
+        this.videoFileName = "";
+        this.strmAddr = "";
     }
 
     public void setFormObjectInfo(String fontName, TbVmsFormObjectDto obj) {
@@ -92,18 +96,29 @@ public class VmsFormObject implements Serializable {
         this.bitmapType = obj.getBitmapType();
         this.bitmapId = obj.getBitmapId();
 
+        this.videoFileName = "";
+        this.strmAddr = "";
+
         if (VmsFormService.isObjectBitmapId(this.objectType)) {
             this.objectKind = eVmsFormObjectKind.OBJECT_BITMAP_ID;
+            if (obj.getVmsFormObjectTypeCd() == 200) {
+                // 동영상 파일
+                this.objectKind = eVmsFormObjectKind.OBJECT_VIDEO_FILE;
+            }
+            else if (obj.getVmsFormObjectTypeCd() == 300) {
+                // 스트리밍 주소
+                this.objectKind = eVmsFormObjectKind.OBJECT_STREAM_URL;
+            }
         }
         else if (obj.getVmsFormObjectTypeCd() == 3) {
             // 소통정보배경 이미지
             this.objectKind = eVmsFormObjectKind.OBJECT_BITMAP;
         }
-        else if (obj.getVmsFormObjectTypeCd() == 201) {
+        else if (obj.getVmsFormObjectTypeCd() == 200) {
             // 동영상 파일
             this.objectKind = eVmsFormObjectKind.OBJECT_VIDEO_FILE;
         }
-        else if (obj.getVmsFormObjectTypeCd() == 301) {
+        else if (obj.getVmsFormObjectTypeCd() == 300) {
             // 스트리밍 주소
             this.objectKind = eVmsFormObjectKind.OBJECT_STREAM_URL;
         }

+ 6 - 47
src/main/java/com/its/vms/dto/TbVmsCtlrDto.java

@@ -591,7 +591,7 @@ public class TbVmsCtlrDto implements Serializable {
             Integer vmsFormId = units[ii].getVmsFormId();
 
             if (pForm.isObjectDownload()) {
-                // TODO: 모든 객체를 추가해 줘야 한다.
+                // 모든 객체를 추가해 줘야 한다.
                 List<VmsFormObject> objects = pForm.getObjects();
                 VmsFormDto formDto = formData.addForm(vmsFormId, formDisplaySec, formDisplayType, formBkClr, objects.size());
                 for (int jj = 0; jj < objects.size(); jj++) {
@@ -613,10 +613,10 @@ public class TbVmsCtlrDto implements Serializable {
                         formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
                     }
                     else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_VIDEO_FILE) {
-                        formObjDto = new VmsFormObjVideo(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), "");
+                        formObjDto = new VmsFormObjVideo(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), formObj.getVideoFileName());
                     }
                     else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_STREAM_URL) {
-                        formObjDto = new VmsFormObjStream(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), "");
+                        formObjDto = new VmsFormObjStream(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), formObj.getStrmAddr());
                     }
                     else {
                         formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
@@ -674,11 +674,10 @@ public class TbVmsCtlrDto implements Serializable {
 
         int formId = units[downloadCnt].getFormNo();
         int downloadFormCnt = 1;
-        int displaySec = 1;//units[downloadCnt].getDisplaySec();
-        int displayType = units[downloadCnt].getDisplayType();
         VmsFormDataDto formData = new VmsFormDataDto(formId, downloadFormCnt);
 
         if (pForm.isObjectDownload()) {
+            // 모든 객체를 추가해 줘야 한다.
             List<VmsFormObject> objects = pForm.getObjects();
             VmsFormDto formDto = formData.addForm(vmsFormId, formDisplaySec, formDisplayType, formBkClr, objects.size());
             for (int jj = 0; jj < objects.size(); jj++) {
@@ -700,10 +699,10 @@ public class TbVmsCtlrDto implements Serializable {
                     formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[downloadCnt].getBitmapId());
                 }
                 else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_VIDEO_FILE) {
-                    formObjDto = new VmsFormObjVideo(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), "");
+                    formObjDto = new VmsFormObjVideo(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), formObj.getVideoFileName());
                 }
                 else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_STREAM_URL) {
-                    formObjDto = new VmsFormObjStream(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), "");
+                    formObjDto = new VmsFormObjStream(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), formObj.getStrmAddr());
                 }
                 else {
                     formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
@@ -727,46 +726,6 @@ public class TbVmsCtlrDto implements Serializable {
                     this.vmsCtlrNmbr, formCnt, downloadCnt + 1, pForm.getVmsFormId(), formId, formBitmapId);
         }
 
-//        VmsFormDataDto formData = new VmsFormDataDto(formId, downloadFormCnt);
-//        int ii = downloadCnt;
-//        VmsForm pForm = this.formManager.getItem(units[ii].getFormIdx());
-//        List<VmsFormObject> objects = pForm.getObjects();
-//        VmsFormDto formDto = formData.addForm(units[ii].getVmsFormId(), units[ii].getDisplaySec(), units[ii].getDisplayType(), units[ii].getBkClr(), objects.size());
-//        for (int jj = 0; jj < objects.size(); jj++) {
-//            VmsFormObject formObj = objects.get(jj);
-//
-//            int objSize = formObj.getObjectSize();
-//            int blinking = formObj.getBlinking();
-//            int posX = formObj.getPosX();
-//            int posY = formObj.getPosY();
-//            int bkClr = formObj.getBkColor();
-//
-//            String fileName = String.format("C:\\DRIVE_E\\ANDONG_VMS_FTP\\FORM\\%d_%d_%d-%d-%d-%d-%d.bmp", this.vmsCtlrNmbr, ii, jj, posX, posY, formObj.getDsplWidth(), formObj.getDsplHeight());
-//
-//            VmsFormObj formObjDto;
-//            if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_TEXT) {
-//                int clrR = formObj.getFontClr().getRed();
-//                int clrG = formObj.getFontClr().getGreen();
-//                int clrB = formObj.getFontClr().getBlue();
-//                int fontNameCd = formObj.getFontNameCd();
-//                formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, formObj.getFontSize(), fontNameCd, formObj.getFontBold(), formObj.getTextData());
-//            }
-//            else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_BITMAP_ID) {
-//                //formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
-//                ItsUtils.saveByteArrayToFile(fileName, formObj.getImageData());
-//                formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
-//            }
-//            else {
-//                //formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
-//                ItsUtils.saveByteArrayToFile(fileName, formObj.getImageData());
-//                formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
-//            }
-//            formObjDto.calSize();
-//            formDto.addObject(formObjDto);
-//        }
-//        formDto.calObjCount();
-//        formData.calFormCount();
-
         VmsReqDownloadForm downloadForm = new VmsReqDownloadForm(this, formData);
         return sendData(downloadForm, 1);
     }

+ 3 - 1
src/main/java/com/its/vms/dto/TbVmsFormObjectDto.java

@@ -35,9 +35,11 @@ public class TbVmsFormObjectDto implements Serializable {
     private Integer vmsDsplSize;
     private Integer symbLibNmbr;
     private Long vmsIfscId;
+    private Long strmCtlrNmbr;
+    private String strmAddr;
 
     private byte[] imagData;
     private eVmsImageType bitmapType;
     private int bitmapId;
-
+    private String videoFileName;
 }

+ 2 - 2
src/main/java/com/its/vms/dto/TbVmsSymbLibDto.java

@@ -66,7 +66,7 @@ public class TbVmsSymbLibDto implements Serializable {
         if ("PNG".equalsIgnoreCase(this.symbImagType)) {
             return eVmsImageType.VMS_IMAGE_TYPE_PNG;
         }
-        return eVmsImageType.VMS_IMAGE_TYPE_VIDEO;
+        return eVmsImageType.VMS_IMAGE_TYPE_BMP;
     }
 
     public void setSymbInfo() {
@@ -77,7 +77,7 @@ public class TbVmsSymbLibDto implements Serializable {
         String symbFileName = "";
         if ("SBT3".equals(getSymbType())) {
             symbFileName = this.symbFileNm;
-            this.imagType = eVmsImageType.VMS_IMAGE_TYPE_VIDEO;
+            this.imagType = eVmsImageType.VMS_IMAGE_TYPE_BMP;
         }
         else {
             switch(getImagType()) {

+ 4 - 0
src/main/java/com/its/vms/entity/TbVmsFormObject.java

@@ -39,6 +39,8 @@ public class TbVmsFormObject implements Serializable {
     private Integer vmsDsplSize;
     private Integer symbLibNmbr;
     private Long vmsIfscId;
+    private Long strmCtlrNmbr;
+    private String strmAddr;
 
     public TbVmsFormObjectDto toDto() {
         return TbVmsFormObjectDto.builder()
@@ -63,6 +65,8 @@ public class TbVmsFormObject implements Serializable {
                 .vmsDsplSize(this.vmsDsplSize)
                 .symbLibNmbr(this.symbLibNmbr)
                 .vmsIfscId(this.vmsIfscId)
+                .strmCtlrNmbr(this.strmCtlrNmbr)
+                .strmAddr(this.strmAddr)
                 .imagData(null)
                 .bitmapType(null)
                 .bitmapId(0)

+ 22 - 6
src/main/java/com/its/vms/service/VmsFormService.java

@@ -117,8 +117,7 @@ public class VmsFormService {
                 }
 
                 int objType = obj.getVmsFormObjectTypeCd();
-
-                if (isObjectBitmap(obj.getVmsFormObjectTypeCd())) {
+                if (isObjectBitmap(objType)) {
                     // 심벌라이브러리를 참조하는 객체인데 참조하는 심벌라이브러리가 없으면 객체를 추가하지 않는다.
                     TbVmsSymbLibDto vmsSymbLib = this.vmsSymbService.find(obj.getSymbLibNmbr()+"0");
                     if (vmsSymbLib == null) {
@@ -132,6 +131,27 @@ public class VmsFormService {
                     obj.setBitmapType(vmsSymbLib.getImagType());
                     obj.setBitmapId(vmsSymbLib.getDnldSymbLibNmbr());
                 }
+                if (objType == 200) {
+                    // 동영상(폼을 만들때 동영상 파일을 선택한다)
+                    TbVmsSymbLibDto videoSymbLib = this.vmsSymbService.find(obj.getSymbLibNmbr()+"0");
+                    if (videoSymbLib == null) {
+                        log.error("VmsFormService.loadVmsFormObjectInfo: VMF Form Object Video Symbol Library not Found {}, {}.", obj.getVmsFormId(), obj.getSymbLibNmbr());
+                        return;
+                    }
+                    obj.setVideoFileName(videoSymbLib.getSymbFileNm());
+                    obj.setBitmapType(videoSymbLib.getImagType());
+                    obj.setBitmapId(videoSymbLib.getDnldSymbLibNmbr());
+                }
+                if (objType == 300) {
+                    // 스트리밍 영상(폼을 만들때 스트리밍 영상을 선택한다)
+                    TbVmsSymbLibDto strmSymbLib = this.vmsSymbService.find(obj.getSymbLibNmbr()+"0");
+                    if (strmSymbLib == null) {
+                        log.error("VmsFormService.loadVmsFormObjectInfo: VMF Form Object Stream Symbol Library not Found {}, {}.", obj.getVmsFormId(), obj.getSymbLibNmbr());
+                        return;
+                    }
+                    obj.setBitmapType(strmSymbLib.getImagType());
+                    obj.setBitmapId(strmSymbLib.getDnldSymbLibNmbr());
+                }
 
                 // 폼정보에 오브젝트 객체를 추가
                 formObj.getObjects().add(obj);
@@ -179,10 +199,6 @@ public class VmsFormService {
     }
 
     public static boolean isObjectBitmap(int objType) {
-// 200: //동영상
-// 300: //스티리밍영상
-//            case 200: //동영상
-//            case 300: //스티리밍영상
         return (objType ==   1 || //심볼
                 objType ==   2 || //이미지(파일에서 직접입력한것임)
                 objType ==   3 || //소통정보배경이미지

+ 25 - 14
src/main/java/com/its/vms/service/VmsManageService.java

@@ -22,7 +22,6 @@ import com.its.vms.process.DbmsData;
 import com.its.vms.process.DbmsDataProcess;
 import com.its.vms.process.DbmsDataType;
 import com.its.vms.xnettcp.vms.process.TcpServerSendData;
-import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.RequiredArgsConstructor;
@@ -514,14 +513,16 @@ public class VmsManageService {
                     break;
                 case eSchTp_video:  //동영상
                     // 동영상명칭이 설정되지 않은 것은 표출하지 않는다.
-                    if (data.getSymbLibNmbr() != 0 && data.getSymbLibNmbr() != 200 && !"".equals(data.getStrmAddr())) {
+                    //if (data.getSymbLibNmbr() != 0 && data.getSymbLibNmbr() != 200 && !"".equals(data.getStrmAddr()))
+                    {
                         TbVmsScheduleDto videoSchedule = schedule.clone();
                         vmsObj.getSchedule().add(videoSchedule);
                     }
                     break;
                 case eSchTp_stream: //스트리밍영상
                     //스트리밍주소가 설정되지 않은 것은 표출하지 않는다.
-                    if (data.getSymbLibNmbr() == 300 && !"".equals(data.getStrmAddr())) {
+                    //if (data.getSymbLibNmbr() == 300 && !"".equals(data.getStrmAddr()))
+                    {
                         TbVmsScheduleDto streamSchedule = schedule.clone();
                         vmsObj.getSchedule().add(streamSchedule);
                     }
@@ -910,16 +911,21 @@ public class VmsManageService {
                         form.setVmsFormDsplDrctCd(1);
                     }
 
-                    if (obj.getVmsFormObjectTypeCd() == 201 || obj.getVmsFormObjectTypeCd() == 301) {
-                        // 201:동영상명칭, 301:스트리밍영상주소
-                        formObj.setTextData(schedule.getStrmAddr());
-                        form.setObjectDownload(true);
-                    }
-
                     if (obj.getVmsFormObjectTypeCd() == 200 || obj.getVmsFormObjectTypeCd() == 300) {
                         // 200:동영상이미지, 300:스트리밍영상이미지
-                        formObj.setMemSymbLibNmbr(schedule.getSymbLibNmbr()+"0");
                         if (obj.getVmsFormObjectTypeCd() == 200) {
+                            formObj.setVideoFileName(obj.getVideoFileName());
+                            formObj.setTextData(obj.getVideoFileName());
+                        }
+                        else if (obj.getVmsFormObjectTypeCd() == 300) {
+                            formObj.setStrmAddr(obj.getStrmAddr());
+                            formObj.setTextData(obj.getStrmAddr());
+                        }
+                        form.setObjectDownload(true);
+
+                        formObj.setMemSymbLibNmbr(obj.getSymbLibNmbr()+"0");
+                        //if (obj.getVmsFormObjectTypeCd() == 200)
+                        {
                             if (formObj.getDsplWidth() == 0 || formObj.getDsplHeight() == 0) {
                                 formObj.setPosX(0);                     // NUMBER(5)	Y			VMS 표출 X좌표
                                 formObj.setPosY(0);                     // NUMBER(5)	Y			VMS 표출 Y좌표
@@ -932,7 +938,11 @@ public class VmsManageService {
                                         ctlrNmbr, schedule.getVmsFormId(), formObj.getMemSymbLibNmbr());
                             }
                             else {
-                                form.setDsplHh(Math.toIntExact(symb.getPlayTm()));
+                                if (form.getDsplHh() == 0 || form.getDsplHh() > symb.getPlayTm()) {
+                                    if (symb.getPlayTm() > 0) {
+                                        form.setDsplHh(Math.toIntExact(symb.getPlayTm()));
+                                    }
+                                }
                             }
                         }
                     }
@@ -1434,9 +1444,10 @@ public class VmsManageService {
             pForm.makeVmsDsplMsgData(this.formService, this.symbService, this.ifscService);
 
             // FTP 다운로드 하는 경우 폼을 FTP 디렉토리에 저장해야함
-            if (pForm.getFileType() != VmsProtocolConst.P_FILE_TYPE_VIDEO  &&   // 비디오
-                pForm.getFileType() != VmsProtocolConst.P_FILE_TYPE_STREAM      // 스트리밍영상 등은 로컬파일로 저장할 필요가 없음
-            ) {
+            //if (pForm.getFileType() != VmsProtocolConst.P_FILE_TYPE_VIDEO  &&   // 비디오
+            //    pForm.getFileType() != VmsProtocolConst.P_FILE_TYPE_STREAM      // 스트리밍영상 등은 로컬파일로 저장할 필요가 없음
+            //)
+            {
                 // 파일이름을 여기서 변경하면 ftp 파일명이 변경된다.
                 if (vmsObj.isFtpDownload()) {
                     String formFileName;

+ 3 - 0
src/main/java/com/its/vms/ui/MainUI.java

@@ -311,6 +311,9 @@ public class MainUI {
         CtlrSttsTableModel tableModel = (CtlrSttsTableModel) tblCtlrList.getModel();
         this.selObj = tableModel.getControllerInfo(row);
         if (this.selObj != null) {
+            //this.selObj.downloadForm();
+            //this.selObj.downloadAutoFixForm();
+
             txtId.setText(this.selObj.getCtlrId());
             txtName.setText(this.selObj.getName());
 

+ 2 - 2
src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsImageType.java

@@ -8,8 +8,8 @@ public enum eVmsImageType {
     VMS_IMAGE_TYPE_BMP  (0x00, "0x00.image_bmp"),
     VMS_IMAGE_TYPE_GIF  (0x01, "0x01.image_gif"),
     VMS_IMAGE_TYPE_JPG  (0x02, "0x02.image_jpg"),
-    VMS_IMAGE_TYPE_PNG  (0x03, "0x03.image_png"),
-    VMS_IMAGE_TYPE_VIDEO(0x04, "0x04.image_avi");
+    VMS_IMAGE_TYPE_PNG  (0x03, "0x03.image_png");//,
+    //VMS_IMAGE_TYPE_VIDEO(0x04, "0x04.image_avi");
 
     private final int value;
     private final String string;

+ 3 - 1
src/main/resources/mybatis/mapper/VmsFormMapper.xml

@@ -44,7 +44,9 @@
                t1.vms_dspl_size           AS vmsDsplSize,
                nvl(t1.trfc_fill_cd, 'N')  AS trfcFillCd,
                nvl(t1.symb_lib_nmbr, 0)   AS symbLibNmbr,
-               nvl(t1.vms_ifsc_id, 0)     AS vmsIfscId
+               nvl(t1.vms_ifsc_id, 0)     AS vmsIfscId,
+               nvl(t1.strm_ctlr_nmbr, 0)  AS strmCtlrNmbr,
+               t1.strm_addr               AS strmAddr
         from tb_vms_form_object t1, tb_vms_form t2, tb_vms_symb_lib t3
         where t1.vms_form_id = t2.vms_form_id
           and t1.symb_lib_nmbr = t3.symb_lib_nmbr(+)