This forum is read-only - Please use our new Citavi Forum instead.
Dieses Forum dient nur zur Recherche - Bitte nutzen Sie das neue Citavi Forum für Ihre Fragen.

Einem KnowledgeItem EntityLinks zuweisen

Fragen zur Bedienung von Citavi 5

Einem KnowledgeItem EntityLinks zuweisen

Postby jay-squared » 2017-06-08 13:26

Systeminformationen: [ -, -, -, -, -, - ]

Liebes Citavi-Team,

um das Problem "Zitate verbinden" endlich mal in der einzigen Art und Weise zu begegnen, die ich kenne, habe ich mich an ein Makro gesetzt.

Mein Anwendungsfall ist übrigens der, dass ich erstmal alles, was wichtig erscheint, als wörtliches Zitat erfassse, aber später, wenn ich den Artikel dann verstanden habe, würde ich gerne den Willy Brandt machen, und zusammenwachsen lassen, was zusammen gehört, und in eine Zusammenfassung/indirektes Zitat, welches mehrere wörtliche Zitate verbindet, kombinieren.

Problem nun: wie weise ich einem KnowledgeItem EntityLinks der Art Annotation zu? Die vorhandenen Annotationen abfragen, geht relativ problemlos, aber das zuweisen scheitert (das sieht man beim Ausführen des Makros, wenn man den Inhalt der beiden Pop-Up-Fenster vergleicht, da sollte ja eigentlich die gleiche Zahl drin stehen).

Code: Select all
using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms;

using SwissAcademic;
using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Citations;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Collections;

// Implementation of macro editor is preliminary and experimental.
// The Citavi object model is subject to change in future version.

public static class CitaviMacro
{
   public static void Main()
   {
      List<KnowledgeItem> listKnowledgeItems = Program.ActiveProjectShell.PrimaryMainForm.GetSelectedQuotations();   
      Reference reference = Program.ActiveProjectShell.PrimaryMainForm.GetSelectedReferences().FirstOrDefault();
      
      KnowledgeItem mergedKnowledgeItem = new KnowledgeItem(reference, QuotationType.DirectQuotation);
      
      Project project = Program.ActiveProjectShell.Project;
      
      List<EntityLink> annotations = new List<EntityLink>();
      List<PageRange> pageRangesList = new List<PageRange>();
      List<string> text = new List<string>();
      
      foreach (KnowledgeItem knowledgeItem in listKnowledgeItems)
      {         
         foreach (EntityLink entityLink in knowledgeItem.EntityLinks)
         {
            if (entityLink.Indication.Equals(EntityLink.PdfKnowledgeItemIndication, StringComparison.OrdinalIgnoreCase) && entityLink.Target is Annotation) annotations.Add(entityLink);
         }
         
         pageRangesList.Add(knowledgeItem.PageRange);         
         text.Add(knowledgeItem.Text);

      }      
      
      mergedKnowledgeItem.Text = String.Join("\n", text.ToArray());
      
      pageRangesList.Sort(new PageRangeComparer());
      if (string.IsNullOrEmpty(pageRangesList.Last().EndPage.ToString()) || pageRangesList.Last().EndPage.ToString() == pageRangesList.FirstOrDefault().StartPage.ToString())
      {
         mergedKnowledgeItem.PageRange = mergedKnowledgeItem.PageRange.Update(pageRangesList.FirstOrDefault().StartPage.ToString());
      }
      else
      {
         mergedKnowledgeItem.PageRange = mergedKnowledgeItem.PageRange.Update(pageRangesList.FirstOrDefault().StartPage.ToString()+"-"+pageRangesList.Last().EndPage.ToString());
      }      
      
      MessageBox.Show(annotations.Count().ToString());
      
      foreach (EntityLink entityLink in annotations)
      {
         mergedKnowledgeItem.EntityLinks.Append(entityLink);
      }
      
      MessageBox.Show(mergedKnowledgeItem.EntityLinks.Count().ToString());
      
      reference.Quotations.Add(mergedKnowledgeItem);
   }
}
class PageRangeComparer : IComparer<PageRange>
{
   public int Compare(PageRange x, PageRange y)
   {
      if (x == null)
      {
         if (y == null)
         {
            return 0;
         }
         else
         {
            return -1;
         }
      }
      else
      {
         if (y == null)
         {
            return 1;
         }
         else
         {                  
            if (x.NumberingType.CompareTo(y.NumberingType) != 0)
            {
               return  x.NumberingType.CompareTo(y.NumberingType);
            }
            else if (x.NumeralSystem.CompareTo(y.NumeralSystem) != 0)
            {
               return x.NumeralSystem.CompareTo(y.NumeralSystem);
            }
            else
            {
               return x.StartPage.CompareTo(y.StartPage);
            }
         }
      }
   }
} // end PageRangeComparer


In concreto: Das hier
Code: Select all
foreach (EntityLink entityLink in annotations)
      {
         mergedKnowledgeItem.EntityLinks.Append(entityLink);
      }

macht nix.
jay-squared
Citavi Expert
 

Re: Einem KnowledgeItem EntityLinks zuweisen

Postby jay-squared » 2017-06-08 13:52

Vielleicht ist meine Idee mit der Kopie der EntityLinks aber auch gar nicht die richtige Methode. Konkret geht es ja darum, dass das neue Wissenselement mit identischen Markierungen in der PDF verbunden ist, wie die Originalwissenselemente. Aber ich merke, dass eine Markierung mit diskontinuierlicher Markierung immer noch nur ein EntityLink der Art Annotation hat. Statt dem, was ich da mache, müsste man also irgendwie eine Annotation in der PDF erzeugen, welche, ggf. diskontinuierlich, die Begrenzungen aller Originalannotationen übernimmt, und dann müsste man diese neue Annotation mit dem neuen Wissenselement verknüpfen. Hmm.
jay-squared
Citavi Expert
 

Re: Einem KnowledgeItem EntityLinks zuweisen

Postby Sebastian Pabel » 2017-06-12 13:53

Hallo, JJ,

die EntityLinks greifen in der Tat zu kurz, denn sie sind (wie der Name schon sagt) nur ein Verweis auf das Zielobjekt.

Um mehr über die Annotations herauszufinden, müssen Sie über Extras > Verweise noch die SwissAcademic.Pdf.dll aus dem Citavi-bin-Ordner hinzufügen und sie im Makro mit using SwissAcademic.Pdf; referenzieren.

Nach der Prüfung, ob der EntityLink tatsächlich auf eine Annotation zeigt (haben Sie ja schon gemacht), können Sie sich das Zielobjekt explizit als Annotation für den EntityLink entityLink so holen:

Code: Select all
Annotation target = (Annotation)entityLink.Target;


Damit haben Sie dann das echte Annotationsobjekt mit all seinen Eigenschaften. Die Markierungsbereiche sind als PDF-Quads in einem IEnumerable hinterlegt, das Sie so auslesen können:

Code: Select all
var quads = target.Quads;
foreach(var quad in quads)
{
   DebugMacro.WriteLine(quad.ToString());
}


Aus den Koordinaten der einzelnen Elemente sollte es dann möglich sein, ein neues "Gesamt-Quad" auszurechnen und damit eine neue neue Annotation zu erzeugen. Auf die Frage, wie das dann im Detail funktionieren könnte, muss ich leider passen. Daniel kann hier eventuell weiterhelfen.

Viele Grüße
Sebastian

Wurde Ihre Frage vollständig beantwortet? Bitte klicken Sie auf das grüne Häkchen (= Antwort akzeptieren) oben rechts in meiner Antwort. Andere Forenbenutzer können sich dann leichter orientieren, wenn sie auf der Suche nach einer Lösung sind.
Sebastian Pabel
Site Admin
 


Return to Citavi 5 Support (Deutsch)