Avatar billede shale Nybegynder
28. januar 2003 - 15:56 Der er 8 kommentarer og
1 løsning

Database info skal vælge templatefil. flere templates i samme fil

Ok først vil jeg lige sige at jeg er ny i perl, men det er meget vigtigt at jeg får dette lavet da det skal bruges på arbejdet, så here goes.

Jeg har en database over komponenter til produkter, som jeg bruger til en søgeflade via browser. Disse komponenter skal eksporteres til et andet værktøj.

I dette værktøj er der symboler som bliver brugt til at lave PCB-diagrammer med, og disse har selvfølgelig navne.

Fra værktøjet har jeg eksporteret ascii filer som virker som en template sådan at hver komponent bliver oprettet i værktøjet med dette symbols indstillinger (pins, værdi osv).

hvis jeg fx i kolonnen med symbolnavne har "transistor, capacitor, resistor" kan jeg så via perl script dynamisk vælge templatefil som de kommer i databasen?
(transistor.txt, capacitor.txt eller resistor.txt) og kan jeg udskrive disse i kun een fil? så altså 100 forskellige komponenter med 3 forskellige slags symboler kommer i en fil kaldet komponent_final.txt

Hvis dette var totalt uforståeligt så undskyld, men håber stadig på et svar.... og jeg skal nok uddybe. Skal dog lige nævnes at jeg har det meste af koden selv men er gået fast i det med flere symbolnavne


På forhånd tak.
Avatar billede erikjacobsen Ekspert
28. januar 2003 - 16:01 #1
Selvfølgelig kan du det - selv om jeg ikke forstår
detaljerne i dit spørgsmål. Jeg gør selv noget
tilsvarende, hvor et felt i en tabel-indgang bestemmer
hvilket "plugin" (du siger template) der skal hentes.
Jeg bruger så PHP - men det gør ingen forskel.

Flere detaljer .. ?
Avatar billede shale Nybegynder
28. januar 2003 - 16:10 #2
#*******************************************************************************
# Version 0.3
#
# Short description
# -----------------
# Importing data from Parts Search -> one HKP file using a template.
#
# Future implants / updates
# --------------------------
# * Better localtime format. Should be using english time format...
# * Constant strings insted of numbers.
#
# Version 0.1 by SVG
# ------------------
# First version released
#*******************************************************************************

#use ODBC connection
use Win32::ODBC;

package main;

use strict;

my $DbObject;
my @DataFromPS;
my $NumOf;

die "Usage PDBModifyPart.pl <Input HKP-Template file> <Output HKP file> <ODBC-Source Name> <Table Name>" unless ($#ARGV eq 3);

# Open the HKP file
die "Error opening input HKP file: $!" unless open(HKPFILE, "<$ARGV[0]");

# Open the HKP file
die "Error opening output HKP file: $!" unless open(OUTPUTFILE, ">$ARGV[1]");

# Open the LOG file
die "Error opening log file: $!" unless open(LOGFILE, ">ps2hkp.log");

print LOGFILE "Reading data from Parts Search...\n";
$DbObject = &ConnectDB();
&ReadDataFromPS($DbObject);

print LOGFILE "Writing new HKP-file with data from Parts Search...\n";
&WriteHKPFile();

print LOGFILE "Exporting data to Mentor PDB...\n";
&HKP2PDB($DataFromPS[0][4]);

exit(0);

sub HKP2PDB($)
{
    my $PDB_Partition = $_[0];
    my $symbol_name = $_[0];
  #system("d:\\Mentor\\WG2002\\VBDC\\bin\\HKP2PartsDB.exe");
  system("d:\\Mentor\\WG2002\\VBDC\\bin\\HKP2PartsDB -r -l \"p:\\NewEDA\\Mentorlib\\LogFiles\\HKP2PartsDB-$PDB_Partition.txt\" -p \"p:\\NewEDA\\MentorLib\\BeoLib.lmc\" -i \"HKP-output\\${symbol_name}_final.hkp\" -o \"P:\\NewEDA\\MentorLib\\PartsDBLibs\\$PDB_Partition.pdb\"");
}

#*******************************************************************************
# Function : GetLocalDate()
# Info    : 
#*******************************************************************************
sub GetLocalDate()
{
  my $sec;
  my $min;
  my $hour;
  my $mday;
  my $mon;
  my $year;
  my $wday;
  my $yday;
  my $isdst;
 
  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

  # Remove 1 from the variable. but only the first number. I don't why it shows 102 insted of 02
  $year =~ s/1?//;

  return "$mday/$mon/20$year $hour:$min";
}

#*******************************************************************************
# Function : WriteHKPFile()
# Info    : Write the HKP file and replace what is specified in the
#            HKP-Template.
#*******************************************************************************
sub WriteHKPFile()
{
  my @ArrayContainingFile;
  my $NumberOfElements;
  my $Element;
  my $TmpStr;
  my $cnt;
  my $DateAndTime;
 
  $DateAndTime = &GetLocalDate();
 
  @ArrayContainingFile = <HKPFILE>;      # Copy the intire file to an array.
  close(FILE);

  for($Element = 0; $Element < 5; $Element++)
  {   
    print OUTPUTFILE @ArrayContainingFile[$Element];
  }

  $NumberOfElements = @ArrayContainingFile;

  for($cnt = 0; $cnt < $NumOf; $cnt++)
  {
    if($DataFromPS[$cnt][0] != "")
    {
      for($Element = 5; $Element < $NumberOfElements; $Element++)
      {   
        $TmpStr = @ArrayContainingFile[$Element];
       
        $TmpStr =~ s/\$PART_NUMBER\$/$DataFromPS[$cnt][0]/;  #Replace Number
        $TmpStr =~ s/\$PART_NAME\$/$DataFromPS[$cnt][2]/;    #Replace Name
        $TmpStr =~ s/\$PART_LABEL\$/$DataFromPS[$cnt][1]/;    #Replace Label
        $TmpStr =~ s/\$VALUE\$/$DataFromPS[$cnt][5]/;        #Replace Value
        $TmpStr =~ s/\$SYMBOL\$/$DataFromPS[$cnt][3]/;        #Replace Symbol
        #$TmpStr =~ s/\$MODIFIED\$/$DateAndTime/;              #Replace Modified
       
        if($TmpStr=~/\$MODIFIED\$/)
        {
       
        }
        else
        {
          print OUTPUTFILE $TmpStr;
        }
      }
    }
    else
    {
      print LOGFILE "Warning! Empty row detected.\n";
    }
  } 
  print LOGFILE "Number of rows added: ", $NumOf, "\n";
}

#*******************************************************************************
# Function : ConnectDB()
# Info    : Open a connection to Parts Search (SQL-Server: STDB01)
#*******************************************************************************
sub ConnectDB
{
  my $dsn;
  my $db;

  #Name on ODBC connection
  $dsn = "DSN=$ARGV[2];UID=XXXXX;PWD=XXXXX;";
   
  #Connection to database
  if (!($db = new Win32::ODBC($dsn)))
  {
    print LOGFILE "Error connecting to $dsn\n";
    print LOGFILE "Error: " . Win32::ODBC::Error() . "\n";
    exit;
  }
  else
  {
    return $db;
  }
}

#*******************************************************************************
# Function : ReadDataFromPS($)
# Info    : 
#*******************************************************************************
sub ReadDataFromPS($)
{
  my $found = 0;
  my $x;
  my $y;
  my $NumOfTables;
  my $db = $_[0];
  my @tables;
  my @data;
  my $value;
 
  $db->Sql("SELECT * FROM $ARGV[3]");

  while ($db->FetchRow())
  {     
    $NumOf++;
    push @data, [$db->Data("part_no"),
                $db->Data("label"),
                $db->Data("part_name"),
                $db->Data("symbol_name"),
                $db->Data("PDB_Partition"),                            $db->Data("value")];
  } 

  for($y = 0; $y < $NumOf; $y++)
  {       
    push @DataFromPS, [$data[$y][0],    # Save data into an array
                      $data[$y][1],
                      $data[$y][2],                   
                      $data[$y][3],
                      $data[$y][4],
                      $data[$y][5]];
  } 
}
Avatar billede shale Nybegynder
28. januar 2003 - 16:11 #3
Ok here goes..... som det er nu bliver template filen specificeret ved et argument i bat filen..... dette skal ikke foregå sådan, men ved at den henter "symbol_name" fra databasen
Avatar billede shale Nybegynder
28. januar 2003 - 16:12 #4
og jeg vil meget gerne have sådan at den skriver de komponenter med forskellige templates ud i samme fil
Avatar billede shale Nybegynder
28. januar 2003 - 16:14 #5
og du får lige en template fil også. kan være det giver mere mening så

Filetype ASCII_PDB
.Version "02.00"
.Units th
.Notation European

.Number "$PART_NUMBER$"
    ..Name "$PART_NAME$"
        ...Default
    ..Label "$PART_LABEL$"
        ...Default
    ..Desc ""
    ..RefPrefix "L"
    ..TopCell ""
    ..BottomCell ""
    ..Prop "Type",    "Inductor",    "Text"
    ..Prop "Value",    "$VALUE$",    "Real"
    ..SwapGroup    "gate"
        ...SwapID    "P0"
        ...SwapID    "P1"
        ...SwapIDProperties    "P0"
            ....Prop "Pin Type",    "Bidirectional",    "Text"
        ...SwapIDProperties    "P1"
            ....Prop "Pin Type",    "Bidirectional",    "Text"
    ..Symbol    "$SYMBOL$"
        ...Default
        ...Symbol_SwapGroup    "gate"
            ....PinName    "1"
            ....PinName    "2"
    ..Slots
        ...Slot_SwapGroup    "gate"
            ....PinNumber    "1"
            ....PinNumber    "2"
Avatar billede erikjacobsen Ekspert
28. januar 2003 - 16:24 #6
Lidt inspiration:

Du kan ikke åbne din HKPFILE før du har slået din komponent
op i databasen. Den skal altså flyttes ned.

Men jeg kan ikke gennemskue helt hvad der sker...
Avatar billede shale Nybegynder
28. januar 2003 - 17:02 #7
Havde jeg ikke lige tænkt på ^^

Du har vel ikke en metode til at få flere komponenter lavet på forskellige templates skud ned i samme fil? Forestil dig ovenstående template hvor ordene lukket i $$ bliver lavet om til ja det der står der :D

Forestil dig at fx en ic har 6 pins/slots (ovenstående har 2) i databasen står der så ic_powerfix som symbol_name. Det navn skal så vælge en templaten ic_power.hkp i stedet for den ovenstående, men det skal stadig puttes i den samme output fil
Avatar billede shale Nybegynder
28. januar 2003 - 17:03 #8
tåger jeg helt?
Avatar billede shale Nybegynder
22. april 2003 - 13:31 #9
Lukket og slukket
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester