Чтобы работать с аннотациями, вы можете использовать некоторый упрощенный интерфейс кодирования, как описано в справочном разделе здесь:
![введите здесь описание изображения](https://i.stack.imgur.com/GejfT.jpg)
Или вы можете использовать полный интерфейс, как я покажу вам ниже. Аннотации — это один из видов Component
в DigitalMicrograph. (Другие — ROI
, ImageDisplay
и корень ImageDocument
). Здесь вы найдете все необходимые команды (справка F1):
![введите здесь описание изображения](https://i.stack.imgur.com/F8Fai.jpg)
// Get the imageDisplay from the image
// (It is the "parent" component of all things displayed on the image.)
image img := GetFrontImage()
imageDisplay disp = img.ImageGetImageDisplay(0)
// If you want to remove components of a specific type
number annoType = 5 // Box
number nBoxAnno = disp.ComponentCountChildrenOfType( annoType )
OKDialog( "There are " + nBoxAnno + " annotations of type " + annoType + ".\nRemove them now." )
for( number i = 0; i<nBoxAnno; i++ )
{
// Get first existing component of a specific type
component boxComp = disp.ComponentGetNthChildOfType( annoType, 0 )
// Remove it from its parent component (the imageDisplay)
boxComp.ComponentRemoveFromParent()
}
// If you want to remove all components of a specific type
number nAllAnno = disp.ComponentCountChildren()
OKDialog( "There are " + nAllAnno + " child components.\nRemove them now." )
for( number i = 0; i<nAllAnno; i++ )
{
// Get first existing component
component anyComp = disp.ComponentGetChild( 0 )
// Remove it from its parent component (the imageDisplay)
anyComp.ComponentRemoveFromParent()
}
В примере я удалил все аннотации одного типа. Если вы хотите удалить некоторые из них, вам нужно изменить цикл for. Вы можете выполнять различные проверки компонента, чтобы узнать, хотите ли вы его удалить или нет.
Некоторое более широкое объяснение для лучшего понимания:
Вам нужно знать, что каждая Image
— это данные в памяти (плюс калибровка и теги). Каждый Image
может иметь один или несколько ImageDisplays
, которые являются объектами, отвечающими за отображение данных на экране. (Как растр, линейный график, электронная таблица...). Общий объект, который записывается на жесткий диск, — это ImageDocument
.
Каждый ImageDisplay
связан ровно с одним Image
(данными), но каждый Image
может иметь более одного независимого ImageDisplay
. Image
может существовать без ImageDisplay
(тогда он просто невидим в памяти и будет удален из памяти после завершения сценария). ImageDisplay
не может существовать без Image
.
Каждый ImageDocument
содержит несколько ImageDisplays
(плюс связанные Images
). ImageDocument
также может не содержать «ImageDisplay» - тогда это пустая страница.
В «нормальном» простом случае, когда вы создаете image
в скрипте, он сначала невидим и без ImageDisplay
, и без ImageDocument
, но когда вы отображаете его в первый раз, ImageDisplay
и ImageDocument
создаются автоматически:
image img := RealImage( "Test", 4, 100, 100 )
// imageDisplay disp1 = img.ImageGetImageDisplay(0) // Does not work yet!
img.ShowImage()
imageDisplay disp = img.ImageGetImageDisplay(0)
imageDocument doc = img.ImageGetOrCreateImageDocument() // Always works
Теперь, как было сказано ранее, аннотации — это всего лишь один вид component
, как и сам imageDisplay
, поэтому можно использовать все команды для components
. Любой «компонент» может иметь дочерние компоненты (построение дерева). Итак, сначала вам нужно найти родителя, затем вы можете подсчитать количество дочерних элементов — либо всех, либо определенного типа — и выполнить итерацию, чтобы получить их. Затем вы можете изменить их (цвета и т. д.) или удалить их из родительского элемента, как показано выше.
Почему это так сложно?
Потому что это очень общая и гибкая концепция!
Пример 1: у вас может быть одно изображение (отображение), у которого есть другое изображение (отображение) в качестве дочернего элемента. Вы получаете такую вещь, когда копируете одно изображение на другое:
![введите здесь описание изображения](https://i.stack.imgur.com/QlTdg.jpg)
Пример 2. У вас может быть один image
(данные) с двумя разными и независимыми imageDisplays
, чтобы вы могли одновременно отображать одни и те же данные в виде электронной таблицы и растра. изображение.
Пример 3: у вас может быть один ROI
(который также является component
) одновременно на двух разных imageDisplays
. Если вы переместите «один», «другой» также переместится:
image img1 := RealImage( "img1", 4, 100, 100 )
image img2 := RealImage( "img2", 4, 100, 100 )
ROI theROI = NewROI()
theROI.ROISetVolatile(0)
theROI.ROISetRectangle( 10, 10, 30, 30 )
img1.ShowImage()
img2.ShowImage()
img1.ImageGetImageDisplay(0).ImageDisplayAddROI( theROI )
img2.ImageGetImageDisplay(0).ImageDisplayAddROI( theROI )
Я призываю вас «поиграть» с концепциями image
, imageDocument
, imageDisplay
, ROI
и Component
, чтобы лучше понять внутреннюю работу. Вам не понадобится это для простых сценариев, но это бесценное знание, когда вы хотите создавать более сложные вещи, к которым вы стремитесь.
person
BmyGuest
schedule
01.06.2017