• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Вставка размера файла в текст документа

Автор Core2Duo, 24.09.11, 09:50:54

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Core2Duo

Понадобилось вставить размер файла чертежа/фрагмента (в байтах) в тектстовое поле , допустим,основной надписи. Как это можно реализовать ?

можно ли сделать макрос, например $filesize, который будет заменяться на размер открытого документа?
PS SDK ни разу не открывал, терминологию в Вашем ответе могу не понять :) попроще бы ) ну или мало ли кто-то сделал уже свое такое!
Всем спасибо!

Tonik

Придется открыть SDK. ))
Делал похожее для подсчета пунктов технических требований.
Возможно так сойдет, размер может вставляться неточный. Да и когда вставляешь текстовый блок, размер файла уже меняется.


void FileSize( ksAPI7::IKompasDocument2DPtr & doc )
{
    LPCWSTR pathname ( doc->GetPathName() );
    WIN32_FIND_DATA ffd;
    HANDLE hFind = INVALID_HANDLE_VALUE;
    DWORD dwError=0;

    //newKompasAPI->MessageBoxExW(pathname, L"ERRR", 0);

    hFind = FindFirstFile(pathname, &ffd);

    if (INVALID_HANDLE_VALUE == hFind)
    {
        newKompasAPI->MessageBoxExW(L"FindFirstFile", L"ERROR", 0);
        return;
    }

    unsigned long fSizeL = ffd.nFileSizeLow;
    unsigned long fSizeH = ffd.nFileSizeHigh;

    FindClose(hFind);

    // Запишем значение в текстовый блок на текущем виде чертежа
    ksAPI7::IViewsAndLayersManagerPtr viewsMng( doc->GetViewsAndLayersManager() );
    if ( viewsMng )
    {
      ksAPI7::IViewsPtr views( viewsMng->GetViews() );
      if ( views )
      {
          ksAPI7::IViewPtr view( views->GetActiveView() );
          ksAPI7::IDrawingContainerPtr drCont( view );
          ksAPI7::IDrawingTextsPtr textCol( drCont->GetDrawingTexts() );
          ksAPI7::IDrawingTextPtr newText( textCol->Add() );
          if ( newText )
          {
              newText->X = 0;
              newText->Y = 0;
             
              ksAPI7::ITextPtr text( newText );

              char buf[128];
              ::sprintf( buf, "SIZE:%d", fSizeL);
              text->Str = buf;
              text->Style = ksTSDrawingAnnotation;
             
              newText->Update();

          }
      }
    }
}


Poltava

Да я тоже предложил свой вариант для компас марко.
Для правильной простановки размера на распечатанном документе, файл перед печатью нужно сохранить, затем применить макрос. Для того чтобы файл не поменял размер его нужно закрыть без сохранения.
# -*- coding: cp1251 -*-
#|7
import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH
import os
import sys

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
MH.iKompasObject = iKompasObject

iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
MH.iApplication = iApplication

iDocument2D = iKompasObject.ActiveDocument2D()
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)
iDocumentSpc = iKompasObject.SpcActiveDocument()


ActiveDoc = MH.iApplication.ActiveDocument.PathName
ActiveDocPath = os.path.getsize(w)
global iStamp

def addText(columnNumber,text,height=3.5,aling=0,ksu=1.0,style=32768,color=0,fontname="GOST type A"):
    """"Функция заполнения текстом ячейки
    входные параметры
    Обязательные:
    columnNumber - номер ячейки для заполнения
    text - вносимый текст
    то что можно не указывать так как есть значение по умолчанию,
    а для ввода своего значения если оно идет не подряд нжно указать
    и имя передаваемой переменной тогда их порядок не имеет значения
    height - высота текста
    aling - выравнивание текста
    ksu - сужение текста
    style - номер стиля текста
    color - цвет текста
    fontname - название шрифта"""


    iStamp.ksColumnNumber(columnNumber) #Номер ячейки для заполнения
    iTextLineParam = KAPI.ksTextLineParam(iKompasObject.GetParamStruct(LDefin2D.ko_TextLineParam))
    iTextLineParam.Init()
    iTextLineParam.style = style

    iTextItemArray = KAPI.ksDynamicArray(iKompasObject.GetDynamicArray(4))
   
    iTextItemParam = KAPI.ksTextItemParam(iKompasObject.GetParamStruct(LDefin2D.ko_TextItemParam))
    iTextItemParam.Init()
    iTextItemParam.s = text #Текст вносимый в ячейку
    iTextItemParam.type = 0

    iTextItemFontParam = KAPI.ksTextItemFont(iTextItemParam.GetItemFont())
    iTextItemFontParam.Init()
    iTextItemFontParam.bitVector = 4096
    iTextItemFontParam.color = color
    iTextItemFontParam.fontName = fontname
    iTextItemFontParam.height = height
    iTextItemFontParam.ksu = ksu

    iTextItemArray.ksAddArrayItem(-1, iTextItemParam)

    iTextLineParam.SetTextItemArr(iTextItemArray)
    iStamp.ksTextLine(iTextLineParam)
    iStamp.ksSetTextLineAlign(aling)#Выравнивание текста в ячейке


       
ActDocPathName = MH.iApplication.ActiveDocument.PathName#Получить путь к активному документу
DocSize = os.path.getsize(ActDocPathName)#Получить размер файла


Tip_documenta = iKompasObject.ksGetDocumentType(0)
global iStamp

if Tip_documenta == 1 or Tip_documenta == 2 :
    for i in range(2):   
        iStamp = iDocument2D.GetStamp()
        iStamp.ksOpenStamp()
        addText(31,e)
        iStamp.ksCloseStamp
    iKompasObject.ksMessage("Данные успешно внесены")

if Tip_documenta != 1 and Tip_documenta != 2: iKompasObject.ksMessage("Данные не внесены так как не опознан тип документа")


Кстати сразу вопрос к экспертам в программировании. Для корректной работы пришлось организовать вот этот цикл
    for i in range(2):   
        iStamp = iDocument2D.GetStamp()
        iStamp.ksOpenStamp()
        addText(31,e)
        iStamp.ksCloseStamp

Без него макрос срабатывает только со второго раза причин понять не могу. Буду рад если объясните. Да и вообще принимаю любую критику так как в программировании экспертом не являюсь

Tonik


Poltava

Спасибо Tonik действительно помогло, а то этот кусок у меня в трех скриптах таким образом работал а сам не мог найти ошибку.
Кстати сразу созрел второй вопрос. Если запустить макрос с открытым штампом то данные в него не записываются. И как с этим бороться тоже пока не понял может кто подскажет

b_leo

Да, а не плохо бы было сделать как у Microsoft в Office:

Вставка -> Поле -> Свойства документа -> выбираешь нужное поле и вставляешь где хочешь. Хоть в текст, хоть в колонтитул.У нас так рамки ГОСТовские в Worde сделаны.

Хочешь "Размер файла", хочешь "Длинное имя файла" (с путями), хочешь короткое, ect. Изменился размер файла и в поле он меняется при обновлении или печати документа.

Но это скорее в "Пожелания и предложения". Тем более новый ГОСТ 2.104-2006 предполагает эти данные на документе.

Вот как это у них просто делается: